Heim > Java > javaLernprogramm > Hauptteil

So stellen Sie Jar-Dateien in SpringBoot bereit

WBOY
Freigeben: 2023-05-24 13:15:23
nach vorne
718 Leute haben es durchsucht

Hauptkonfiguration:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
Nach dem Login kopieren

Konfigurationsausgabe:

cd package-optimize-level0
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel    16M Feb 24 21:06 package-optimize-app1/target/package-optimize-app1.jar

java -jar package-optimize-app1/target/package-optimize-app1.jar
Nach dem Login kopieren

Wichtige Hinweise:

  • (Die aktuelle Demoanwendung basiert nur auf sehr wenigen Komponenten von Spring-Boot-Starter-Web, und alle Build-Ausgaben sind es (nur etwa ein Dutzend MB) In tatsächlichen Situationen hängt die Ausgabe-JAR-Datei eines einzelnen Builds von der Menge der projektabhängigen Komponenten ab und liegt im Allgemeinen zwischen mehreren zehn MB und einem oder zweihundert MB oder sogar mehr.

  • Wenn Sie ein Dutzend Microservices bereitstellen müssen, müssen Sie mehrere GB an Dateien übertragen, was viel Zeit in Anspruch nimmt. Schon ein einzelnes Update eines einzelnen Microservice erfordert die Übertragung von ein bis zweihundert MB.

Stufe 1: Gemeinsame Konstruktionsmethode zur Trennung von Abhängigkeitsgläsern

Referenzprojektverzeichnis: package-optimize-level1

Off-Problemlösung:

  • Reduzieren Sie die Dateigröße eines einzelnen Microservice-Jars, um die Bereitstellung zu erleichtern Der Dateiübertragungsvorgang dauert Sekunden. Hauptkonfiguration:

Weitere Informationen zu wichtigen Konfigurationsanweisungen finden Sie in den folgenden Hinweisen:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>true</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Nach dem Login kopieren

Konfigurationsausgabe:

cd package-optimize-level1
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel   149K Feb 24 20:56 package-optimize-app1/target/package-optimize-app1.jar

java -jar -Djava.ext.dirs=lib package-optimize-app1/target/package-optimize-app1.jar
Nach dem Login kopieren

Erfolgseffekt:

  • Ein einzelner Build gibt im Allgemeinen nur Gläser aus basiert von der Menge der projektabhängigen Komponenten. Mit ein oder zweihundert KB ist die Übertragung grundsätzlich in Sekundenschnelle möglich.

  • Dies ist die am weitesten verbreitete Optimierungslösung im Internet, und es lohnt sich, sie weiter zu untersuchen: Wenn es ein Dutzend Mikrodienste gibt und jeder Dienst über eine JAR- und eine LIB-Verzeichnisdatei verfügt, ist bei der ersten Bereitstellung fast eine Übertragung erforderlich ein oder zwei GB Dateien.

Level 2: Alle modulabhängigen Jars im selben lib-Verzeichnis zusammenführen

Referenzprojektverzeichnis: package-optimize-level2

Das Problem wurde gelöst:

  • Alle modulabhängigen Jars im selben zusammenführen lib-Verzeichnis, da jedes Modulprojekt auf einem hohen Grad an JAR-Überlappung basiert, beträgt die Gesamtgröße aller Dienstbereitstellungsdateien im Allgemeinen zweihundert bis dreihundert MB

  • Wenn jedoch -Djava.ext.dirs = lib ist Wird zum Laden aller Jars in jede JVM verwendet. Erstens lädt jede JVM alle Jars vollständig und verbraucht Ressourcen. Zweitens verursachen unterschiedliche Versionen jeder Microservice-Komponente Versionskonflikte.

Hauptkonfiguration:

Anweisungen zur Schlüsselkonfiguration. Weitere Informationen finden Sie in den folgenden Hinweisen:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
                        详见各子模块中 boot-jar-output 属性定义
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
                所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
                详见各子模块中boot-jar-output属性定义
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Nach dem Login kopieren

Alle von jedem Mikrodienst erstellten lib-Verzeichnisdateien und JAR-Dateien werden im öffentlichen Devops-Verzeichnis zusammengefasst.

Die META-INFO/MANIFEST-Datei in der Microservice-JAR-Datei generiert das Class-Path-Attribut basierend auf der modulabhängigen Komponentenliste und vermeidet so unterschiedliche Versionen von JAR:

Class-Path: lib/spring-boot-starter-web-2.4.3.jar lib/spring-boot-starte
 r-2.4.3.jar lib/spring-boot-2.4.3.jar lib/spring-boot-autoconfigure-2.4
 .3.jar lib/spring-boot-starter-logging-2.4.3.jar lib/logback-classic-1.
 2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-api-1.7.30.jar lib/log4j-t
 o-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib/jul-to-slf4j-1.7.30.jar
  lib/jakarta.annotation-api-1.3.5.jar lib/spring-core-5.3.4.jar lib/spr
 ing-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/spring-boot-starter-json-2
 .4.3.jar lib/jackson-databind-2.11.4.jar lib/jackson-annotations-2.11.4
 .jar lib/jackson-core-2.11.4.jar lib/jackson-datatype-jdk8-2.11.4.jar l
 ib/jackson-datatype-jsr310-2.11.4.jar lib/jackson-module-parameter-name
 s-2.11.4.jar lib/spring-boot-starter-tomcat-2.4.3.jar lib/tomcat-embed-
 core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/tomcat-embed-websocket-9.0
 .43.jar lib/spring-web-5.3.4.jar lib/spring-beans-5.3.4.jar lib/spring-
 webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/spring-context-5.3.4.jar 
 lib/spring-expression-5.3.4.jar
Nach dem Login kopieren

Konfigurationsausgabe:

cd package-optimize-level2
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  34 lixia  wheel   1.1K Feb 24 22:27 lib
-rw-r--r--   1 lixia  wheel   150K Feb 24 22:31 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar
Nach dem Login kopieren

Erfolgseffekt :

    Der Startvorgang erfordert nicht mehr die Parameterdefinition -Djava.ext.dirs=lib.
  • Alle Microservice-JARs verweisen auf das gemeinsame Verzeichnis aller vom Projekt zusammengeführten abhängigen Komponenten. Die Gesamtgröße der Bereitstellungsdatei beträgt im Allgemeinen zwei bis dreihundert MB.
  • Durch Anpassen des Klassenpfads in der META-INFO/MANIFEST-Datei in jeder Microservice-JAR-Datei, um die abhängige Versionskomponentenklasse klar anzugeben, kann das Problem unterschiedlicher Komponentenversionskonflikte in jedem Microservice gelöst werden.
Stufe 3: Unterstützung inoffizieller, vom System eingeführter, von Drittanbietern abhängiger Komponenten SDK-JAR: Eine Möglichkeit besteht darin, es als Referenz an den lokalen privaten Maven-Server zu senden. Dies entspricht der normalen abhängigen JAR-Verarbeitung. Wenn jedoch kein privater Maven-Server vorhanden ist, besteht ein üblicher vereinfachter Ansatz darin, das abhängige JAR direkt zu platzieren das Projekt und verwenden Sie dann den Systembereich in der POM-Way-Definition.

Für die Maven-Jar-Plugin-Komponente, die im POM über systemPath eingeführt wird, verfügt die Maven-Jar-Plugin-Komponente nicht über direkte Parameter zum Deklarieren von Komponenten, die den angegebenen Bereich enthalten -definierte Komponenten werden nicht in META-INFO/MANIFEST angezeigt, was dazu führt, dass die Laufzeitklasse nicht gefunden wird.

Hauptkonfiguration:

  • Bitte beachten Sie die folgenden Hinweise für wichtige Konfigurationsanweisungen:

    <build>
        <finalName>${project.artifactId}</finalName>
        <!--
        特别注意:
        项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
        但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
        -->
        <plugins>
            <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                        <manifestEntries>
                            <!--
                            有些非官方三方的诸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件
                            通过使用额外定义 Class-Path 值来追加指定依赖组件列表,在子模块按实际情况指定 jar-manifestEntries-classpath 值即可
                            例如(注意前面个点字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
                            详见各子模块中 boot-jar-output 属性定义示例
                            -->
                            <Class-Path>${jar-manifestEntries-classpath}</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!--
                            各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
                            详见各子模块中 boot-jar-output 属性定义
                            -->
                            <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                            <silent>false</silent>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- Spring Boot模块jar构建 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includes>
                        <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                        <include>
                            <groupId>null</groupId>
                            <artifactId>null</artifactId>
                        </include>
                    </includes>
                    <layout>ZIP</layout>
                    <!--
                    基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
                    所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
                    详见各子模块中boot-jar-output属性定义
                    -->
                    <!--  -->
                    <outputDirectory>${boot-jar-output}</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    Nach dem Login kopieren
    Hauptkonfiguration des Untermoduls:
    <properties>
        <!-- 按各模块实际目录层次定义相对数据,使所有服务模块输出资源汇聚到相同目录 -->
        <boot-jar-output>../devops</boot-jar-output>
        <!--
        有些供应商的sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件
        通过使用额外定义 Class-Path 值来追加指定依赖组件列表,按实际情况指定 jar-manifestEntries-classpath 值即可
        例如(注意前面个点字符及各空格分隔符,lib后面部分是 artifactId-version.jar 格式而不是实际文件名):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
        -->
        <jar-manifestEntries-classpath>. lib/hik-sdk-1.0.0.jar</jar-manifestEntries-classpath>
    </properties>
    <dependencies>
        <!-- 以相对路径方式定义非官方三方依赖组件 -->
        <dependency>
            <groupId>com.hik</groupId>
            <artifactId>hik-sdk</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
Nach dem Login kopieren
  • Die META-INFO/MANIFEST-Datei in der Microservice-Ausgabe-JAR-Datei wird generiert Das Modul gemäß dem Modul Für das Class-Path-Attribut der abhängigen Komponentenliste wird der Definitionswert des jar-manifestEntries-classpath-Attributs vorne angehängt:

    Class-Path: . lib/hik-sdk-1.0.0.jar lib/spring-boot-starter-web-2.4.3.ja
     r lib/spring-boot-starter-2.4.3.jar lib/spring-boot-2.4.3.jar lib/sprin
     g-boot-autoconfigure-2.4.3.jar lib/spring-boot-starter-logging-2.4.3.ja
     r lib/logback-classic-1.2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-ap
     i-1.7.30.jar lib/log4j-to-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib
     /jul-to-slf4j-1.7.30.jar lib/jakarta.annotation-api-1.3.5.jar lib/sprin
     g-core-5.3.4.jar lib/spring-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/sp
     ring-boot-starter-json-2.4.3.jar lib/jackson-databind-2.11.4.jar lib/ja
     ckson-annotations-2.11.4.jar lib/jackson-core-2.11.4.jar lib/jackson-da
     tatype-jdk8-2.11.4.jar lib/jackson-datatype-jsr310-2.11.4.jar lib/jacks
     on-module-parameter-names-2.11.4.jar lib/spring-boot-starter-tomcat-2.4
     .3.jar lib/tomcat-embed-core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/to
     mcat-embed-websocket-9.0.43.jar lib/spring-web-5.3.4.jar lib/spring-bea
     ns-5.3.4.jar lib/spring-webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/s
     pring-context-5.3.4.jar lib/spring-expression-5.3.4.jar
    Nach dem Login kopieren
  • Konfigurationsausgabe:

    cd package-optimize-level3
    mvn clean install
    
    ls -lh devops/
    total 912
    drwxr-xr-x  36 lixia  wheel   1.1K Feb 24 23:14 lib
    -rw-r--r--@  1 lixia  wheel   150K Feb 24 23:14 package-optimize-app1.jar
    -rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app2.jar
    -rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app3.jar
    
    java -jar devops/package-optimize-app1.jar
    Nach dem Login kopieren
    Endgültiger Implementierungseffekt

    Die abhängigen Komponenten aller Dienste werden zu einem zusammengeführt. Die Gesamtgröße des Verzeichnisses beträgt zwei bis dreihundert MB, und die Übertragungseffizienz wird bei der ersten Bereitstellung erheblich beschleunigt.

    Jedes Microservice-Jar ist ein bis zweihundert KB groß. Tägliche Notfall-Fehlerbehebungen und Updates für einzelne Jars erfolgen grundsätzlich sofort.

    Jedes Microservice-JAR definiert eine Liste von Komponenten, die von der angegebenen Version abhängen, sodass es keine Ladekonflikte zwischen verschiedenen Komponentenversionen gibt.

    • Inoffizielle, von Drittanbietern abhängige Komponenten können ebenfalls normal referenziert und verarbeitet werden.

    Das obige ist der detaillierte Inhalt vonSo stellen Sie Jar-Dateien in SpringBoot bereit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!