複数のアーティファクトをコンパイルして一つにまとめたFat JARを作成する
前提
nkjmlab-fooは以下に依存している.
nkjmlab-common1 : ローカル環境で開発中
nkjmlab-common2: ローカル環境で開発中
log4j-core
ここで,nkjmlab-common1 と nkjmlab-common2 をまとめた,一つのjarを作成したい.
ディレクトリ構成は以下である.
code:ディレクトリ構成
nkjmlab-foo
src/
pom.xml
pom-compile-pom.xml
nkjmlab-common1
src/
pom.xml
nkjmlab-common2
src/
pom.xml
方針
Step1. 複数モジュール (nkjmlab-common1 と nkjmlab-common2) をコンパイルして,ローカルにインストール
Step2. 複数のアーティファクトを一つにまとめたjarを作成する
Step1. 複数モジュールをコンパイルしてローカルにインストール
複数モジュールをコンパイルしてローカルにインストールするためのpom-module-compile.xmlを用意する.
nkjmlab-commons1, nkjmlab-commons2 は,他のmavenプロジェクトを意識せずに書いて良い.つまり,parentの指定は不要
code:nkjmlab-foo/pom-module-compile.xml
<modelVersion>4.0.0</modelVersion>
<groupId>org.nkjmlab</groupId>
<artifactId>nkjmlab-commons</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<modules>
<module>../nkjmlab-common1</module>
<module>../nkjmlab-common2</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<compilerVersion>11</compilerVersion>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
nkjmlab-fooディレクトリで mvn clean install -f module-compile-pom.xml とすると,modulesで指定されたモジュールがコンパイルされ,ローカル環境にインストールされる.
Step2. 複数のアーティファクトを一つにまとめたjarを作成する
<createDependencyReducedPom>: falseで,dependency-reduced-pom.xmlを作らない
<createSourcesJar>: trueで,sourceのjarも作る
<shadedArtifactAttached>: trueで,shaded jarは元のjarとは別に作る
<shadedArtifactId> : shaded jarのartifact idを指定
<artifactSet>: nkjmlab-common*を含めて,nkjmlab-fooを含めない.log4jなどがこの設定で入らなくなる理由は良く分からん.
<filters>: 指定のartifactSetの中で要らない物を削除
code:nkjmlab-foo/pom.xml
<modelVersion>4.0.0</modelVersion>
<groupId>org.nkjmlab</groupId>
<artifactId>nkjmlab-foo</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j-version}</version>
</dependency>
<dependency>
<groupId>org.nkjmlab</groupId>
<artifactId>nkjmlab-common1</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>org.nkjmlab</groupId>
<artifactId>nkjmlab-common2</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<compilerVersion>11</compilerVersion>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<createSourcesJar>true</createSourcesJar>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedArtifactId>${project.artifactId}-common</shadedArtifactId>
<artifactSet>
<includes>
<include>org.nkjmlab:nkjmlab-common*</include>
</includes>
<excludes>
<exclude>org.nkjmlab:nkjmlab-foo</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>net/**/*</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
nkjmlab-fooディレクトリで mvn clean package とすると,複数のアーティファクトを一つにまとめたjarが作成される.