Entfernen Sie den Testcode usw. aus dem mit Spring Initializr erstellten Projekt, um die folgende Dateistruktur zu erstellen.
Gradle
├── build.gradle
├── settings.gradle
└── src
└── main
├── java
│ └── com
│ └── example
│ ├── MyappApplication.java
│ └── ServletInitializer.java
└── resources
├── application.properties
├── static
└── templates
Maven
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── example
│ ├── MyappApplication.java
│ └── ServletInitializer.java
└── resources
├── application.properties
├── static
└── templates
Der Inhalt ist bis auf die Einstellungsdatei identisch.
$ diff -r gradle/myapp maven/myapp
Only in gradle/myapp: build.gradle
Only in maven/myapp: pom.xml
Only in gradle/myapp: settings.gradle
Fügen Sie Apache PDFBox hinzu, eine externe Bibliothek. Hier sehen Sie, wie andere externe Bibliotheken als Spring in der WAR-Datei gespeichert werden.
Gradle (build.gradle)
plugins {
id 'org.springframework.boot' version '2.2.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'war'
}
group = 'com.example'
version = '0.0.1'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
// https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox
implementation 'org.apache.pdfbox:pdfbox:2.0.19'
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
Maven (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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<version>0.0.1</version>
<packaging>war</packaging>
<name>myapp</name>
<description>MyApp project</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.19</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Gradle
Verwendet Gradle 6.3.
$ gradle build
$ unzip build/libs/myapp-0.0.1.war -d dest
Maven
Verwendet Apache Maven 3.6.3.
$ mvn package
$ unzip target/myapp-0.0.1.war -d dest
Spring Boot Executable Jar Format \ -Document
Abhängigkeiten sollten im verschachtelten Verzeichnis WEB-INF / lib abgelegt werden. Abhängigkeiten, die beim Ausführen des integrierten Systems erforderlich sind, bei der Bereitstellung in einem herkömmlichen Webcontainer jedoch nicht benötigt werden, sollten in WEB-INF / lib-bereitgestellt platziert werden.
Spring Boot Executable Jar Format \ -Document
Java bietet keine Standardmethode zum Laden verschachtelter JAR-Dateien (dh der in einem JAR enthaltenen JAR-Dateien). Dies kann ein Problem sein, wenn Sie eine eigenständige Anwendung verteilen müssen, die ohne Bereitstellung über die Befehlszeile ausgeführt werden kann.
Um dieses Problem zu lösen, verwenden viele Entwickler "schattierte" JAR-Dateien. Das schattierte Glas verpackt alle Klassen aus allen Gläsern in einem einzigen "Überglas". Das Problem bei schattierten JAR-Dateien besteht darin, dass schwer zu erkennen ist, welche Bibliotheken tatsächlich in der Anwendung enthalten sind. Es können auch Probleme auftreten, wenn mehrere Gläser denselben Dateinamen (aber unterschiedlichen Inhalt) verwenden. Spring Boot verfolgt einen anderen Ansatz und kann Gläser direkt verschachteln.
Gradle
$ tree dest
dest
├── META-INF
│ └── MANIFEST.MF
├── WEB-INF
│ ├── classes
│ │ ├── application.properties
│ │ ├── com
│ │ │ └── example
│ │ │ ├── MyappApplication.class
│ │ │ └── ServletInitializer.class
│ │ ├── static
│ │ └── templates
│ ├── lib
│ │ ├── classmate-1.5.1.jar
│ │ ├── commons-logging-1.2.jar
│ │ ├── fontbox-2.0.19.jar
│ │ ├── hibernate-validator-6.0.18.Final.jar
│ │ ├── jackson-annotations-2.10.3.jar
│ │ ├── jackson-core-2.10.3.jar
│ │ ├── jackson-databind-2.10.3.jar
│ │ ├── jackson-datatype-jdk8-2.10.3.jar
│ │ ├── jackson-datatype-jsr310-2.10.3.jar
│ │ ├── jackson-module-parameter-names-2.10.3.jar
│ │ ├── jakarta.validation-api-2.0.2.jar
│ │ ├── jboss-logging-3.4.1.Final.jar
│ │ ├── jul-to-slf4j-1.7.30.jar
│ │ ├── log4j-api-2.12.1.jar
│ │ ├── log4j-to-slf4j-2.12.1.jar
│ │ ├── logback-classic-1.2.3.jar
│ │ ├── logback-core-1.2.3.jar
│ │ ├── pdfbox-2.0.19.jar
│ │ ├── slf4j-api-1.7.30.jar
│ │ ├── snakeyaml-1.25.jar
│ │ ├── spring-aop-5.2.5.RELEASE.jar
│ │ ├── spring-beans-5.2.5.RELEASE.jar
│ │ ├── spring-boot-2.2.6.RELEASE.jar
│ │ ├── spring-boot-autoconfigure-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-json-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-logging-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-validation-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-web-2.2.6.RELEASE.jar
│ │ ├── spring-context-5.2.5.RELEASE.jar
│ │ ├── spring-core-5.2.5.RELEASE.jar
│ │ ├── spring-expression-5.2.5.RELEASE.jar
│ │ ├── spring-jcl-5.2.5.RELEASE.jar
│ │ ├── spring-web-5.2.5.RELEASE.jar
│ │ └── spring-webmvc-5.2.5.RELEASE.jar
│ └── lib-provided
│ ├── jakarta.annotation-api-1.3.5.jar
│ ├── spring-boot-starter-tomcat-2.2.6.RELEASE.jar
│ ├── tomcat-embed-core-9.0.33.jar
│ ├── tomcat-embed-el-9.0.33.jar
│ └── tomcat-embed-websocket-9.0.33.jar
└── org
└── springframework
└── boot
└── loader
├── ExecutableArchiveLauncher.class
├── JarLauncher.class
├── LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
├── LaunchedURLClassLoader.class
├── Launcher.class
├── MainMethodRunner.class
├── PropertiesLauncher$1.class
├── PropertiesLauncher$ArchiveEntryFilter.class
├── PropertiesLauncher$PrefixMatchingArchiveFilter.class
├── PropertiesLauncher.class
├── WarLauncher.class
├── archive
│ ├── Archive$Entry.class
│ ├── Archive$EntryFilter.class
│ ├── Archive.class
│ ├── ExplodedArchive$1.class
│ ├── ExplodedArchive$FileEntry.class
│ ├── ExplodedArchive$FileEntryIterator$EntryComparator.class
│ ├── ExplodedArchive$FileEntryIterator.class
│ ├── ExplodedArchive.class
│ ├── JarFileArchive$EntryIterator.class
│ ├── JarFileArchive$JarFileEntry.class
│ └── JarFileArchive.class
├── data
│ ├── RandomAccessData.class
│ ├── RandomAccessDataFile$1.class
│ ├── RandomAccessDataFile$DataInputStream.class
│ ├── RandomAccessDataFile$FileAccess.class
│ └── RandomAccessDataFile.class
├── jar
│ ├── AsciiBytes.class
│ ├── Bytes.class
│ ├── CentralDirectoryEndRecord$1.class
│ ├── CentralDirectoryEndRecord$Zip64End.class
│ ├── CentralDirectoryEndRecord$Zip64Locator.class
│ ├── CentralDirectoryEndRecord.class
│ ├── CentralDirectoryFileHeader.class
│ ├── CentralDirectoryParser.class
│ ├── CentralDirectoryVisitor.class
│ ├── FileHeader.class
│ ├── Handler.class
│ ├── JarEntry.class
│ ├── JarEntryFilter.class
│ ├── JarFile$1.class
│ ├── JarFile$2.class
│ ├── JarFile$JarFileType.class
│ ├── JarFile.class
│ ├── JarFileEntries$1.class
│ ├── JarFileEntries$EntryIterator.class
│ ├── JarFileEntries.class
│ ├── JarURLConnection$1.class
│ ├── JarURLConnection$2.class
│ ├── JarURLConnection$CloseAction.class
│ ├── JarURLConnection$JarEntryName.class
│ ├── JarURLConnection.class
│ ├── StringSequence.class
│ └── ZipInflaterInputStream.class
└── util
└── SystemPropertyUtils.class
17 directories, 99 files
Maven
$ tree dest
dest
├── META-INF
│ ├── MANIFEST.MF
│ └── maven
│ └── com.example
│ └── myapp
│ ├── pom.properties
│ └── pom.xml
├── WEB-INF
│ ├── classes
│ │ ├── application.properties
│ │ └── com
│ │ └── example
│ │ ├── MyappApplication.class
│ │ └── ServletInitializer.class
│ ├── lib
│ │ ├── classmate-1.5.1.jar
│ │ ├── commons-logging-1.2.jar
│ │ ├── fontbox-2.0.19.jar
│ │ ├── hibernate-validator-6.0.18.Final.jar
│ │ ├── jackson-annotations-2.10.3.jar
│ │ ├── jackson-core-2.10.3.jar
│ │ ├── jackson-databind-2.10.3.jar
│ │ ├── jackson-datatype-jdk8-2.10.3.jar
│ │ ├── jackson-datatype-jsr310-2.10.3.jar
│ │ ├── jackson-module-parameter-names-2.10.3.jar
│ │ ├── jakarta.annotation-api-1.3.5.jar
│ │ ├── jakarta.validation-api-2.0.2.jar
│ │ ├── jboss-logging-3.4.1.Final.jar
│ │ ├── jul-to-slf4j-1.7.30.jar
│ │ ├── log4j-api-2.12.1.jar
│ │ ├── log4j-to-slf4j-2.12.1.jar
│ │ ├── logback-classic-1.2.3.jar
│ │ ├── logback-core-1.2.3.jar
│ │ ├── pdfbox-2.0.19.jar
│ │ ├── slf4j-api-1.7.30.jar
│ │ ├── snakeyaml-1.25.jar
│ │ ├── spring-aop-5.2.5.RELEASE.jar
│ │ ├── spring-beans-5.2.5.RELEASE.jar
│ │ ├── spring-boot-2.2.6.RELEASE.jar
│ │ ├── spring-boot-autoconfigure-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-json-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-logging-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-validation-2.2.6.RELEASE.jar
│ │ ├── spring-boot-starter-web-2.2.6.RELEASE.jar
│ │ ├── spring-context-5.2.5.RELEASE.jar
│ │ ├── spring-core-5.2.5.RELEASE.jar
│ │ ├── spring-expression-5.2.5.RELEASE.jar
│ │ ├── spring-jcl-5.2.5.RELEASE.jar
│ │ ├── spring-web-5.2.5.RELEASE.jar
│ │ └── spring-webmvc-5.2.5.RELEASE.jar
│ └── lib-provided
│ ├── spring-boot-starter-tomcat-2.2.6.RELEASE.jar
│ ├── tomcat-embed-core-9.0.33.jar
│ ├── tomcat-embed-el-9.0.33.jar
│ └── tomcat-embed-websocket-9.0.33.jar
└── org
└── springframework
└── boot
└── loader
├── ExecutableArchiveLauncher.class
├── JarLauncher.class
├── LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
├── LaunchedURLClassLoader.class
├── Launcher.class
├── MainMethodRunner.class
├── PropertiesLauncher$1.class
├── PropertiesLauncher$ArchiveEntryFilter.class
├── PropertiesLauncher$PrefixMatchingArchiveFilter.class
├── PropertiesLauncher.class
├── WarLauncher.class
├── archive
│ ├── Archive$Entry.class
│ ├── Archive$EntryFilter.class
│ ├── Archive.class
│ ├── ExplodedArchive$1.class
│ ├── ExplodedArchive$FileEntry.class
│ ├── ExplodedArchive$FileEntryIterator$EntryComparator.class
│ ├── ExplodedArchive$FileEntryIterator.class
│ ├── ExplodedArchive.class
│ ├── JarFileArchive$EntryIterator.class
│ ├── JarFileArchive$JarFileEntry.class
│ └── JarFileArchive.class
├── data
│ ├── RandomAccessData.class
│ ├── RandomAccessDataFile$1.class
│ ├── RandomAccessDataFile$DataInputStream.class
│ ├── RandomAccessDataFile$FileAccess.class
│ └── RandomAccessDataFile.class
├── jar
│ ├── AsciiBytes.class
│ ├── Bytes.class
│ ├── CentralDirectoryEndRecord$1.class
│ ├── CentralDirectoryEndRecord$Zip64End.class
│ ├── CentralDirectoryEndRecord$Zip64Locator.class
│ ├── CentralDirectoryEndRecord.class
│ ├── CentralDirectoryFileHeader.class
│ ├── CentralDirectoryParser.class
│ ├── CentralDirectoryVisitor.class
│ ├── FileHeader.class
│ ├── Handler.class
│ ├── JarEntry.class
│ ├── JarEntryFilter.class
│ ├── JarFile$1.class
│ ├── JarFile$2.class
│ ├── JarFile$JarFileType.class
│ ├── JarFile.class
│ ├── JarFileEntries$1.class
│ ├── JarFileEntries$EntryIterator.class
│ ├── JarFileEntries.class
│ ├── JarURLConnection$1.class
│ ├── JarURLConnection$2.class
│ ├── JarURLConnection$CloseAction.class
│ ├── JarURLConnection$JarEntryName.class
│ ├── JarURLConnection.class
│ ├── StringSequence.class
│ └── ZipInflaterInputStream.class
└── util
└── SystemPropertyUtils.class
18 directories, 101 files
Es ändert sich nicht viel.
$ diff -r gradle/myapp/dest maven/myapp/dest
diff -r gradle/myapp/dest/META-INF/MANIFEST.MF maven/myapp/dest/META-INF/MANIFEST.MF
1a2,5
> Created-By: Maven Archiver 3.4.0
> Build-Jdk-Spec: 11
> Implementation-Title: myapp
> Implementation-Version: 0.0.1
Only in maven/myapp/dest/META-INF: maven
Only in gradle/myapp/dest/WEB-INF/classes: static
Only in gradle/myapp/dest/WEB-INF/classes: templates
Only in maven/myapp/dest/WEB-INF/lib: jakarta.annotation-api-1.3.5.jar
Only in gradle/myapp/dest/WEB-INF/lib-provided: jakarta.annotation-api-1.3.5.jar
Recommended Posts