はじめに
現場でチームメンバーがはまっていて自分もやり方調べて試してもらっても上手くいかなったので、ちょっと別で調べた内容のメモ残しです。
特に難しいこともない内容なのですが、はまるときははまるものですね。
環境
Java8
Maven3
Spring boot 2.0.2.RELEASE
目的
./mvnw clean packageで作成したjar内にexternal jarを含める
プロジェクトの作成
今回はpackageした中に含めればいいだけなので、特に実装はありません。
pom.xml
実装なしでpom.xmlにexternal jarの設定を行っていきます。
dependencies
package内にだけあってもしょうがないので、dependencyに今回追加したいjarの情報を追加してあげます。
追加後にupdateしてあげるとEclipse上での開発は困らないはずです。
mavenの変数展開はそこまで詳しくないのですが、フォルダ設定する際に基準となるフォルダを指定するのに${project.basedir}
と${basedir}の2つがよく検索に引っかかるのですが、前者はプロジェクトディレクトリで後者がpom.xmlのディレクトリを指しているらしいです。
${project.basedir}`を使用します。
とりあえずmavenのページ見ると前者をよく見たので今回は
注意点的にはversion
とjarの名前の最後のversionが一致している必要があるようなので(Eclipseでエラーになる)そこだけ合わせてあげてください。
<dependency>
<groupId>com.tasogarei</groupId>
<artifactId>hogehoge</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/hogehoge1.jar</systemPath>
</dependency>
plugins
jarに混ぜ込む設定はpluginの設定から行います。
configuration
にincludeSystemScope
があり、それをtrue
にしてあげるだけです。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
jarを設定したディレクトリに配置
今回は${project.basedir}/lib/hogehoge1.jar
と設定しているので、適当なjarを配置します。
特に何でもよかったので.m2/
にあったjarを適当に持ってきています。
本当に入っているか確認する
設定は以上となります。
試してみましょう。
package
mvnwコマンドからjarにします。
./mvnw clean package
jarの中身確認
無事jarに出来たのでjar tf
で作成したjarの中身を確認してみます。
確認するとBOOT-INF/lib/hogehoge-1.jar
が存在するため、無事にexternal jarを含めることに成功しました。
$ jar tf jartest-0.0.1-SNAPSHOT.jar | sort
BOOT-INF/
BOOT-INF/classes/
BOOT-INF/classes/application.properties
BOOT-INF/classes/com/
BOOT-INF/classes/com/tasogarei/
BOOT-INF/classes/com/tasogarei/app/
BOOT-INF/classes/com/tasogarei/app/JartestApplication.class
BOOT-INF/lib/
BOOT-INF/lib/hogehoge-1.jar
BOOT-INF/lib/javax.annotation-api-1.3.2.jar
BOOT-INF/lib/jul-to-slf4j-1.7.25.jar
BOOT-INF/lib/log4j-api-2.10.0.jar
BOOT-INF/lib/log4j-to-slf4j-2.10.0.jar
BOOT-INF/lib/logback-classic-1.2.3.jar
BOOT-INF/lib/logback-core-1.2.3.jar
BOOT-INF/lib/slf4j-api-1.7.25.jar
BOOT-INF/lib/snakeyaml-1.19.jar
BOOT-INF/lib/spring-aop-5.0.6.RELEASE.jar
BOOT-INF/lib/spring-beans-5.0.6.RELEASE.jar
BOOT-INF/lib/spring-boot-2.0.2.RELEASE.jar
BOOT-INF/lib/spring-boot-autoconfigure-2.0.2.RELEASE.jar
BOOT-INF/lib/spring-boot-starter-2.0.2.RELEASE.jar
BOOT-INF/lib/spring-boot-starter-logging-2.0.2.RELEASE.jar
BOOT-INF/lib/spring-context-5.0.6.RELEASE.jar
BOOT-INF/lib/spring-core-5.0.6.RELEASE.jar
BOOT-INF/lib/spring-expression-5.0.6.RELEASE.jar
BOOT-INF/lib/spring-jcl-5.0.6.RELEASE.jar
META-INF/
META-INF/MANIFEST.MF
META-INF/maven/
META-INF/maven/com.tasogarei/
META-INF/maven/com.tasogarei/jartest/
META-INF/maven/com.tasogarei/jartest/pom.properties
META-INF/maven/com.tasogarei/jartest/pom.xml
org/
org/springframework/
org/springframework/boot/
org/springframework/boot/loader/
org/springframework/boot/loader/archive/
org/springframework/boot/loader/archive/Archive$Entry.class
org/springframework/boot/loader/archive/Archive$EntryFilter.class
org/springframework/boot/loader/archive/Archive.class
org/springframework/boot/loader/archive/ExplodedArchive$1.class
org/springframework/boot/loader/archive/ExplodedArchive$FileEntry.class
org/springframework/boot/loader/archive/ExplodedArchive$FileEntryIterator$EntryComparator.class
org/springframework/boot/loader/archive/ExplodedArchive$FileEntryIterator.class
org/springframework/boot/loader/archive/ExplodedArchive.class
org/springframework/boot/loader/archive/JarFileArchive$EntryIterator.class
org/springframework/boot/loader/archive/JarFileArchive$JarFileEntry.class
org/springframework/boot/loader/archive/JarFileArchive.class
org/springframework/boot/loader/data/
org/springframework/boot/loader/data/RandomAccessData.class
org/springframework/boot/loader/data/RandomAccessDataFile$1.class
org/springframework/boot/loader/data/RandomAccessDataFile$DataInputStream.class
org/springframework/boot/loader/data/RandomAccessDataFile$FileAccess.class
org/springframework/boot/loader/data/RandomAccessDataFile.class
org/springframework/boot/loader/ExecutableArchiveLauncher.class
org/springframework/boot/loader/jar/
org/springframework/boot/loader/jar/AsciiBytes.class
org/springframework/boot/loader/jar/Bytes.class
org/springframework/boot/loader/jar/CentralDirectoryEndRecord.class
org/springframework/boot/loader/jar/CentralDirectoryFileHeader.class
org/springframework/boot/loader/jar/CentralDirectoryParser.class
org/springframework/boot/loader/jar/CentralDirectoryVisitor.class
org/springframework/boot/loader/jar/FileHeader.class
org/springframework/boot/loader/jar/Handler.class
org/springframework/boot/loader/jar/JarEntry.class
org/springframework/boot/loader/jar/JarEntryFilter.class
org/springframework/boot/loader/jar/JarFile$1.class
org/springframework/boot/loader/jar/JarFile$2.class
org/springframework/boot/loader/jar/JarFile$JarFileType.class
org/springframework/boot/loader/jar/JarFile.class
org/springframework/boot/loader/jar/JarFileEntries$1.class
org/springframework/boot/loader/jar/JarFileEntries$EntryIterator.class
org/springframework/boot/loader/jar/JarFileEntries.class
org/springframework/boot/loader/jar/JarURLConnection$1.class
org/springframework/boot/loader/jar/JarURLConnection$JarEntryName.class
org/springframework/boot/loader/jar/JarURLConnection.class
org/springframework/boot/loader/jar/StringSequence.class
org/springframework/boot/loader/jar/ZipInflaterInputStream.class
org/springframework/boot/loader/JarLauncher.class
org/springframework/boot/loader/LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
org/springframework/boot/loader/LaunchedURLClassLoader.class
org/springframework/boot/loader/Launcher.class
org/springframework/boot/loader/MainMethodRunner.class
org/springframework/boot/loader/PropertiesLauncher$1.class
org/springframework/boot/loader/PropertiesLauncher$ArchiveEntryFilter.class
org/springframework/boot/loader/PropertiesLauncher$PrefixMatchingArchiveFilter.class
org/springframework/boot/loader/PropertiesLauncher.class
org/springframework/boot/loader/util/
org/springframework/boot/loader/util/SystemPropertyUtils.class
org/springframework/boot/loader/WarLauncher.class