eclipse / Java

【Java】MavenでJarの中にライブラリ等の外部Jarを同梱するビルドの方法

JavaのWebアプリケーションやSpring Bootバッチは、ビルドすると依存ライブラリ(外部jar)も同梱された一つのwarやjarが生成されますが、Spring Batchの場合は依存ライブラリはjarに同梱されないため、別途ライブラリだけリリースする必要があるためめんどい。
依存ライブラリが増えた場合に、jarのリリース忘れがあったりするので危険。

やりたいこと

Spring Batchアプリケーションのビルドする際に依存ライブラリも同梱したjarを生成したい。

ビルドツール

Maven

やり方

eclipse-jarinjarloader を使用する。

pom.xml に <properties> と <build>、<repository> を下記のように記載(追記)する。

・・・
<properties>
    <main.class>org.springframework.batch.core.launch.support.CommandLineJobRunner</main.class>
    <jarinjarloader.version>1.0</jarinjarloader.version>
</properties>

<build>
    <finalName>sample-spring-batch</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>
・・・

この状態で maven install すると、依存ライブラリが同梱されたjarが生成される。

ただし、Maven Repository に存在しないjarは同梱されないので注意!

Leave a Reply

Your email address will not be published.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)