GradleでSpring Bootをビルドしたときのjarファイル
Spring Boot 2.5からGradleでビルドすると *.jar
と *-plain.jar
の2つが生成されるようになったので、これらについてのメモ。
Demo
Spring InitializrからGradle Projectを選択してプロジェクトを作成する。(ArtifactなどのProject Metadataはデフォルトのまま)
% tree . . ├── HELP.md ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── demo │ │ └── DemoApplication.java │ └── resources │ └── application.properties └── test └── java └── com └── example └── demo └── DemoApplicationTests.java 14 directories, 10 files
build.gradle
plugins { id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
このプロジェクトをビルドすると、2つのjarファイルができる。
- demo-0.0.1-SNAPSHOT.jar
- demo-0.0.1-SNAPSHOT-plain.jar
demo-0.0.1-SNAPSHOT.jar
bootJar
タスクによって生成されるSpring Boot fat jarで、全てのモジュールのdependenciesを含んでいるため、java -jar demo-0.0.1-SNAPSHOT.jar
で実行できる。
% jar tf build/libs/demo-0.0.1-SNAPSHOT.jar META-INF/ META-INF/MANIFEST.MF org/ org/springframework/ org/springframework/boot/ org/springframework/boot/loader/ org/springframework/boot/loader/ClassPathIndexFile.class org/springframework/boot/loader/ExecutableArchiveLauncher.class org/springframework/boot/loader/JarLauncher.class org/springframework/boot/loader/LaunchedURLClassLoader$DefinePackageCallType.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$ClassPathArchives.class org/springframework/boot/loader/PropertiesLauncher$PrefixMatchingArchiveFilter.class org/springframework/boot/loader/PropertiesLauncher.class org/springframework/boot/loader/WarLauncher.class 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$AbstractIterator.class org/springframework/boot/loader/archive/ExplodedArchive$ArchiveIterator.class org/springframework/boot/loader/archive/ExplodedArchive$EntryIterator.class org/springframework/boot/loader/archive/ExplodedArchive$FileEntry.class org/springframework/boot/loader/archive/ExplodedArchive$SimpleJarFileArchive.class org/springframework/boot/loader/archive/ExplodedArchive.class org/springframework/boot/loader/archive/JarFileArchive$AbstractIterator.class org/springframework/boot/loader/archive/JarFileArchive$EntryIterator.class org/springframework/boot/loader/archive/JarFileArchive$JarFileEntry.class org/springframework/boot/loader/archive/JarFileArchive$NestedArchiveIterator.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/jar/ org/springframework/boot/loader/jar/AbstractJarFile$JarFileType.class org/springframework/boot/loader/jar/AbstractJarFile.class org/springframework/boot/loader/jar/AsciiBytes.class org/springframework/boot/loader/jar/Bytes.class org/springframework/boot/loader/jar/CentralDirectoryEndRecord$1.class org/springframework/boot/loader/jar/CentralDirectoryEndRecord$Zip64End.class org/springframework/boot/loader/jar/CentralDirectoryEndRecord$Zip64Locator.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/JarEntryCertification.class org/springframework/boot/loader/jar/JarEntryFilter.class org/springframework/boot/loader/jar/JarFile$1.class org/springframework/boot/loader/jar/JarFile$JarEntryEnumeration.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$Offsets.class org/springframework/boot/loader/jar/JarFileEntries$Zip64Offsets.class org/springframework/boot/loader/jar/JarFileEntries$ZipOffsets.class org/springframework/boot/loader/jar/JarFileEntries.class org/springframework/boot/loader/jar/JarFileWrapper.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/jarmode/ org/springframework/boot/loader/jarmode/JarMode.class org/springframework/boot/loader/jarmode/JarModeLauncher.class org/springframework/boot/loader/jarmode/TestJarMode.class org/springframework/boot/loader/util/ org/springframework/boot/loader/util/SystemPropertyUtils.class BOOT-INF/ BOOT-INF/classes/ BOOT-INF/classes/com/ BOOT-INF/classes/com/example/ BOOT-INF/classes/com/example/demo/ BOOT-INF/classes/com/example/demo/DemoApplication.class BOOT-INF/classes/application.properties BOOT-INF/lib/ BOOT-INF/lib/spring-boot-autoconfigure-2.6.3.jar BOOT-INF/lib/spring-boot-2.6.3.jar BOOT-INF/lib/jakarta.annotation-api-1.3.5.jar BOOT-INF/lib/spring-context-5.3.15.jar BOOT-INF/lib/spring-aop-5.3.15.jar BOOT-INF/lib/spring-beans-5.3.15.jar BOOT-INF/lib/spring-expression-5.3.15.jar BOOT-INF/lib/spring-core-5.3.15.jar BOOT-INF/lib/snakeyaml-1.29.jar BOOT-INF/lib/logback-classic-1.2.10.jar BOOT-INF/lib/log4j-to-slf4j-2.17.1.jar BOOT-INF/lib/jul-to-slf4j-1.7.33.jar BOOT-INF/lib/spring-jcl-5.3.15.jar BOOT-INF/lib/logback-core-1.2.10.jar BOOT-INF/lib/slf4j-api-1.7.33.jar BOOT-INF/lib/log4j-api-2.17.1.jar BOOT-INF/lib/spring-boot-jarmode-layertools-2.6.3.jar BOOT-INF/classpath.idx BOOT-INF/layers.idx
demo-0.0.1-SNAPSHOT-plain.jar
jar
タスクによって生成されるplain jarファイルで、このモジュールのclassとresourceのみを含んでいる。
% jar tf build/libs/demo-0.0.1-SNAPSHOT-plain.jar META-INF/ META-INF/MANIFEST.MF com/ com/example/ com/example/demo/ com/example/demo/DemoApplication.class application.properties
plain jarを生成したくない場合は、build.gradleにこの設定を追加する。
jar {
enabled = false
}