모든 개발팀에 공유할 연동 모듈이 HttpClient를 사용한다고 하자. 이 모듈은 HttpClient 3 버전을 사용해서 개발하고 있다. 열심히 개발해서 이 모듈을 배포했다. 그런데 문제가 생겼다. 어떤 팀은 이미 HttpClient 4 버전을 사용했고 어떤 팀은 HttpClient 2 버전을 사용하는 것이었다. 그래서 버전 충돌로 인해 제대로 동작하지 않는 상황이 벌어졌다.
이런 일이 벌어질 때 사용하기 좋은 메이븐 플러그인이 있는데, 그 플러그인은 바로 maven-shade-plugin이다.
maven-shade-plugin
maven-shade-plugin은 다음의 두 기능을 제공한다.
- 프로젝트의 타입뿐만 아니라 의존하는 jar에 포함된 모든 타입을 포함하는 한 개의 jar 파일을 만들어준다.
- 패키지 구조를 변경해준다. (재피키지, repackage)
이 예에서 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/ 페이지를 참고한다.