배치 프로그램이나 명령행에서 실행할 간단한 자바 프로그램을 만들 때가 있는데, 이 프로그램이 스프링 프레임워크를 이용한 경우 관련된 jar 파일들을 함께 배포하고 실행 스크립트에 클래스패스를 설정해주고 하는 것이 귀찮을 때가 있다. 내가 만든 클래스 파일/자원 파일뿐만 아니라 스프링 jar 파일에 포함된 클래스/메타 파일들을 모두 하나의 jar 파일로 만들어서 배포하면 프로그램을 실행하는 스크립트가 매우 간단해질텐데, 메이븐의 어셈블리 플러그인이 제공하는 jar-with-dependencies 기능을 사용하면 이 작업을 매우 쉽게 할 수 있다.
maven-assembly-plugin은 jar-with-dependencies 설정을 제공하는데, 이 설정을 사용하면 내가 만든 클래스 및 자원 파일과 의존하는 jar 파일에 포함된 모든 파일을 묶어서 하나의 jar 파일로 만들어준다. 다음은 설정 예이다.
<build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>create-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.prototype.springintegration.AppBootstrapper</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
위 코드에서 maven-shade-plugin 을 사용했는데, 이 플러그인을 사용한 이유는 스프링의 각 jar 파일에 포함되어 있는 메타 파일들을 하나의 파일로 합치기 위함이다. 이 플러그인을 사용하지 않으면 스프링의 각 jar 파일에 포함된 메타 파일을 한 개 jar 파일에 모으는 과정에서 합쳐지지 않고 뎝어쓰기때문에 XML 확장 스키마 등의 설정이 올바르게 동작하지 않게 된다.
위와 같이 설정을 했다면 mvn package 명령어로 의존하는 jar 파일에 속한 모든 내용과 내가 만든 클래스/자원 파일들이 포함된 한 개의 jar 파일을 얻을 수 있다.