주요글: 도커 시작하기
반응형

모든 개발팀에 공유할 연동 모듈이 HttpClient를 사용한다고 하자. 이 모듈은 HttpClient 3 버전을 사용해서 개발하고 있다. 열심히 개발해서 이 모듈을 배포했다. 그런데 문제가 생겼다. 어떤 팀은 이미 HttpClient 4 버전을 사용했고 어떤 팀은 HttpClient 2 버전을 사용하는 것이었다. 그래서 버전 충돌로 인해 제대로 동작하지 않는 상황이 벌어졌다.


이런 일이 벌어질 때 사용하기 좋은 메이븐 플러그인이 있는데, 그 플러그인은 바로 maven-shade-plugin이다.


maven-shade-plugin


maven-shade-plugin은 다음의 두 기능을 제공한다.

  • 프로젝트의 타입뿐만 아니라 의존하는 jar에 포함된 모든 타입을 포함하는 한 개의 jar 파일을 만들어준다.
  • 패키지 구조를 변경해준다. (재피키지, repackage)
설명만 봐서 언뜻 이해가 안 될테니 설정 예를 보자.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputFile>${project.build.directory}/${project.artifactId}-with-common-${project.version}.jar
        </outputFile>
        <minimizeJar>false</minimizeJar>
        <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
        <artifactSet>
            <includes>
                <include>commons-httpclient:commons-httpclient</include>
                <include>commons-logging:commons-logging</include>
                <include>commons-lang:commons-lang</include>
            </includes>
        </artifactSet>
        <relocations>
            <relocation>
                <pattern>org.apache.commons.logging</pattern>
                <shadedPattern>madvirus.relocated.commons.logging</shadedPattern>
            </relocation>
            <relocation>
                <pattern>org.apache.commons.httpclient</pattern>
                <shadedPattern>madvirus.relocated.commons.httpclient</shadedPattern>
            </relocation>
        </relocations>
    </configuration>
</plugin>

이 예에서 artifactSet/includes는 생성할 jar 파일에 포함시킬 의존 대상을 지정한다. 위 코드는 commons-httpclient, commons-logging, commons-lang을 지정했는데, 이 경우 이 세 개의 아티팩트를 위한 jar 파일의 내용과 해당 프로젝트의 클래스/리소스를 모아 하나의 jar를 만든다. 생성할 jar 파일은 outputFile 태그로 지정한다.


relocations은 jar 파일에 담긴 타입의 패키지 구조를 변경한다. 위 예에서는 org.apache.commons.logging 패키지에 속한 타입을 madvirus.relocated.commons.logging 패키지로 바꿔준다. 또한, 변경한 패키지를 사용하는 타입은 바뀐 패키지를 사용하도록 변경한다.


maven-shade-plugin을 이용해서 생성한 jar 파일은 필요한 모든 외부 의존을 포함하고 있기 때문에 jar 파일 한 개만 배포하면 된다. 또한 패키지 구조도 변경했기 때문에, 이 jar 파일을 어디에 배포해도 클래스 충돌 문제가 발생하지 않는다. 위 코드의 경우 HttpClient의 패키지 구조를 변경했으므로, 다른 프로젝트에서 다른 버전의 HttpClient를 사용하더라도 같은 클래스를 사용해서 발생해서 버전 충돌 문제를 피할 수 있다.


이 외에도 몇 가지 기능을 더 제공하는데 이에 대한 내용은 https://maven.apache.org/plugins/maven-shade-plugin/ 페이지를 참고한다.

+ Recent posts