jarの中にjarを含める(jar in jar)

こんにちわ、猫好きリーマンのほげPGです。
今回はmavenを使ってjarの中にjarを含めた実行可能jarの作成を紹介します。
・Spring boot
これで解決なのですが、Spring bootでないプロジェクトで対応したいので不採用です。
・eclipseのエクスポート(実行可能jarを必要なライブラリをパッケージで作成)
これで解決なのですが、mavenで作りたかったので不採用です。
・mavenでeclipseのエクスポートと同様のことをする
紹介サイト(https://libraries.io/github/raisercostin/eclipse-jarinjarloader)を見つけたので、実際に試して確認してみます。
1、Javaプロジェクト作成
以下の構成で作成します。
HogeJar
│ pom.xml
└─src
└─main
├─java
│ └─sample
│ HogeMain.java
└─resources
log4j.properties
HogeMain.java
package sample;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HogeMain {
private static final Logger log = LoggerFactory.getLogger(HogeMain.class);
public static void main(String[] args) {
log.info("Are you hoge? {}", Arrays.toString(args));
}
}
log4j.properties
log4j.rootLogger=DEBUG, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d [%-5p] (%F:%L) %M - %m%n
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sample</groupId>
<artifactId>hoge-jar</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>HogeJar</name>
<properties>
<main.class>sample.HogeMain</main.class>
<jarinjarloader.version>1.0</jarinjarloader.version>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>test</includeScope>
</configuration>
</execution>
<execution>
<id>unpack</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.raisercostin</groupId>
<artifactId>eclipse-jarinjarloader</artifactId>
<version>${jarinjarloader.version}</version>
<type>jar</type>
<overWrite>false</overWrite>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
<Rsrc-Main-Class>${main.class}</Rsrc-Main-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jcenter-bintray</id>
<name>Bintray JCenter Maven Repository</name>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>
2、ビルド
以下コマンドでビルドします。
mvn clean package
作成されたhoge-jar.jarの中身
META-INF/ META-INF/MANIFEST.MF lib/ META-INF/maven/ META-INF/maven/org.raisercostin/ META-INF/maven/org.raisercostin/eclipse-jarinjarloader/ org/ org/eclipse/ org/eclipse/jdt/ org/eclipse/jdt/internal/ org/eclipse/jdt/internal/jarinjarloader/ sample/ lib/log4j-1.2.17.jar lib/slf4j-api-1.7.30.jar lib/slf4j-log4j12-1.7.30.jar log4j.properties META-INF/maven/org.raisercostin/eclipse-jarinjarloader/pom.properties META-INF/maven/org.raisercostin/eclipse-jarinjarloader/pom.xml org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader$1.class org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader$ManifestInfo.class org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader.class org/eclipse/jdt/internal/jarinjarloader/JIJConstants.class org/eclipse/jdt/internal/jarinjarloader/RsrcURLConnection.class org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandler.class org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandlerFactory.class sample/HogeMain.class META-INF/maven/sample/ META-INF/maven/sample/hoge-jar/ META-INF/maven/sample/hoge-jar/pom.xml META-INF/maven/sample/hoge-jar/pom.properties
※lib/にjarが3つあるのが分かります。
3、実行結果
…\HogeJar>java -jar target/hoge-jar.jar Yes 2019-12-27 10:31:22,848 [INFO ] (HogeMain.java:11) main - Are you hoge? [Yes]
4、参考文献
https://libraries.io/github/raisercostin/eclipse-jarinjarloader
プロジェクト一式
今回はここまで。
