Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan fail Jar dalam SpringBoot

Bagaimana untuk menggunakan fail Jar dalam SpringBoot

WBOY
WBOYke hadapan
2023-05-24 13:15:23794semak imbas

Konfigurasi utama:

<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>

Output konfigurasi:

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

Kata kunci:

  • (Aplikasi demo semasa hanya bergantung pada beberapa komponen spring-boot-starter-web, dan semua output binaan hanya kira-kira sepuluh MB Dalam situasi sebenar, balang output bagi satu binaan bergantung pada jumlah komponen yang bergantung kepada projek, secara amnya antara puluhan MB hingga satu Dua ratus MB atau lebih.

  • Jika anda perlu menggunakan sedozen perkhidmatan mikro, anda perlu memindahkan beberapa GB fail, yang akan memakan banyak masa. Malah satu kemas kini kepada perkhidmatan mikro individu memerlukan pemindahan satu hingga dua ratus MB.

Tahap 1: Kaedah pembinaan pemisahan balang bergantung biasa

Direktori projek rujukan: package-optimize-level1

Tutup penyelesaian masalah:

  • Kurangkan saiz fail satu balang perkhidmatan mikro supaya fail boleh dipindahkan dalam beberapa saat semasa proses penempatan. Konfigurasi utama:

Untuk arahan konfigurasi utama, sila lihat nota berikut:

<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>

Output konfigurasi:

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

Kesan pencapaian:

  • Balang keluaran bagi binaan tunggal secara amnya hanya satu atau dua ratus KB berdasarkan jumlah komponen yang bergantung kepada projek, dan pada dasarnya ia boleh dipindahkan dalam beberapa saat.

  • Ini ialah penyelesaian pengoptimuman yang paling biasa dilihat di Internet, dan ia patut diterokai lebih lanjut: Jika terdapat sedozen perkhidmatan mikro, setiap perkhidmatan mempunyai balang dan fail direktori lib, penempatan pertama adalah serupa. Satu atau dua fail GB perlu dipindahkan.

Tahap 2: Gabungkan semua balang bergantung modul ke dalam direktori lib yang sama

Direktori projek rujukan: package-optimize-level2

Selesaikan masalah:

  • Gabungkan semua balang bergantung kepada modul ke dalam direktori lib yang sama Secara umumnya, disebabkan oleh tahap pertindihan yang tinggi dalam balang bergantung bagi setiap satu projek modul, gabungkan semua penggunaan perkhidmatan Jumlah saiz fail pada asasnya adalah dua hingga tiga ratus MB

  • Tetapi jika anda menggunakan -Djava.ext.dirs=lib untuk memuatkan semua balang ke dalam setiap JVM, setiap JVM akan dimuat sepenuhnya. >Sila berikan butiran tentang arahan konfigurasi utama Lihat anotasi berikut:

    <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>
  • Semua fail direktori lib dan balang yang dibina oleh setiap perkhidmatan mikro diagregatkan ke dalam direktori awam devops.

Fail META-INFO/MANIFEST dalam fail balang perkhidmatan mikro akan menjana atribut Laluan Kelas berdasarkan senarai komponen bergantung kepada modul, dengan itu mengelakkan versi balang yang berbeza:

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

konfigurasi Output:

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

Kesan pelaksanaan:

Proses permulaan tidak lagi memerlukan parameter -Djava.ext.dirs=lib takrifan.

Semua balang perkhidmatan mikro merujuk kepada direktori awam semua komponen bergantung gabungan projek Saiz keseluruhan fail penggunaan biasanya dua hingga tiga ratus MB.

  • Dengan menyesuaikan Laluan Kelas dalam fail META-INFO/MANIFEST dalam setiap fail balang perkhidmatan mikro untuk menunjukkan dengan jelas kelas komponen versi bergantung, masalah versi komponen berbeza bercanggah dalam setiap perkhidmatan mikro boleh diselesaikan.

  • Tahap 3: Menyokong komponen bergantung pihak ketiga tidak rasmi yang diperkenalkan oleh sistem
  • Direktori projek rujukan: package-optimize-level3

Selesaikan masalah:

Bagi sesetengah balang pihak ketiga tidak rasmi seperti balang sdk, satu cara adalah dengan menyerahkannya kepada pelayan peribadi tempatan Maven untuk rujukan , yang sama dengan balang bergantung biasa Pemprosesannya adalah sama; tetapi jika tiada pelayan peribadi maven, kaedah penyederhanaan biasa ialah meletakkan balang bergantung secara langsung dalam projek dan kemudian menentukannya dalam pom dengan skop sistem. .

Untuk komponen maven-jar-plugin yang diperkenalkan dalam pom melalui systemPath, tiada pengisytiharan parameter langsung untuk komponen yang mengandungi skop yang ditentukan Jika tiada pemprosesan khas dilakukan META-INFO/MANIFEST Komponen yang ditakrifkan oleh skop ini tidak akan muncul, menyebabkan kelas masa jalan tidak ditemui.

  • Konfigurasi utama:
  • Sila rujuk ulasan berikut untuk arahan konfigurasi utama:

    <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>
  • Konfigurasi utama sub- modul:
    <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>

Fail META-INFO/MANIFEST dalam fail balang output perkhidmatan mikro akan menjana atribut Laluan Kelas berdasarkan senarai komponen yang bergantung kepada modul dan nilai definisi atribut jar-manifestEntries-classpath akan dilampirkan ke hadapan:

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

Output konfigurasi:

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

Kesan pelaksanaan akhir

Bergantung komponen semua perkhidmatan digabungkan menjadi satu direktori, Saiz keseluruhan ialah dua hingga tiga ratus MB, dan kecekapan penghantaran dipercepatkan dengan ketara semasa penggunaan pertama.

Setiap balang perkhidmatan mikro bersaiz satu hingga dua ratus KB Pembetulan pepijat kecemasan harian dan kemas kini pada balang individu pada asasnya serta-merta.

  • Setiap balang perkhidmatan mikro mentakrifkan senarai komponen yang bergantung pada versi yang ditentukan, jadi tidak akan ada konflik pemuatan antara versi komponen yang berbeza.

  • Komponen bergantung pihak ketiga tidak rasmi juga boleh dirujuk dan diproses seperti biasa.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan fail Jar dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam