SpringBoot使用Maven打包——將依賴Jar包與應用Jar包分離

SpringBoot項目使用Maven打包:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

執行mvn clean package命令後,生成應用jar,用壓縮文件查看,maven自動生成了MANIFEST.MF文件:

Manifest-Version: 1.0
Implementation-Title: github-demo
Implementation-Version: 2.1-SNAPSHOT
Start-Class: com.gitlab.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.1.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

 依賴的jar也在應用jar 中,位於BOOT-INF/lib/目錄下。使用java -jar 即可運行這個應用jar包。

       爲了提高部署的效率,需要把應用jar包跟依賴jar包分開,當項目中沒有新增依賴的jar包時,只需把應用單獨打包出來就行,這樣應用jar包的大小會小很多。

       這需要maven-jar-plugin插件,改變默認的打包方式;還需要maven-dependency-plugin,把依賴的jar包打包。pom文件主要部分如下:

    <build>
        <plugins>
            <!--設置應用 Main 參數啓動依賴查找的地址指向外部 lib 文件夾-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!-- 項目所依賴的jar位於同一級的lib目錄下-->
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!--設置 SpringBoot 打包插件不包含任何 Jar 依賴包-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
            </plugin>
            <!--設置將 lib 拷貝到應用 Jar 外面-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

          目的就是爲了把依賴的jar包放到target/lib目錄下,在MANIFEST.MF文件中自動添加Class-Path屬性,指向所依賴的jar包:

Manifest-Version: 1.0
Implementation-Title: github-demo
Implementation-Version: 2.4-SNAPSHOT
Start-Class: com.gitlab.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Class-Path: lib/spring-boot-starter-web-2.2.1.RELEASE.jar lib/spring-b
 oot-starter-2.2.1.RELEASE.jar lib/spring-boot-2.2.1.RELEASE.jar lib/s
 pring-boot-autoconfigure-2.2.1.RELEASE.jar lib/spring-boot-starter-lo
 gging-2.2.1.RELEASE.jar lib/logback-classic-1.2.3.jar lib/logback-cor
 e-1.2.3.jar lib/log4j-to-slf4j-2.12.1.jar lib/log4j-api-2.12.1.jar li
 b/jul-to-slf4j-1.7.29.jar lib/jakarta.annotation-api-1.3.5.jar lib/sn
 akeyaml-1.25.jar lib/spring-boot-starter-json-2.2.1.RELEASE.jar lib/j
 ackson-databind-2.10.0.jar lib/jackson-annotations-2.10.0.jar lib/jac
 kson-core-2.10.0.jar lib/jackson-datatype-jdk8-2.10.0.jar lib/jackson
 -datatype-jsr310-2.10.0.jar lib/jackson-module-parameter-names-2.10.0
 .jar lib/spring-boot-starter-tomcat-2.2.1.RELEASE.jar lib/tomcat-embe
 d-core-9.0.27.jar lib/tomcat-embed-el-9.0.27.jar lib/tomcat-embed-web
 socket-9.0.27.jar lib/spring-boot-starter-validation-2.2.1.RELEASE.ja
 r lib/jakarta.validation-api-2.0.1.jar lib/hibernate-validator-6.0.18
 .Final.jar lib/jboss-logging-3.4.1.Final.jar lib/classmate-1.5.1.jar 
 lib/spring-web-5.2.1.RELEASE.jar lib/spring-beans-5.2.1.RELEASE.jar l
 ib/spring-webmvc-5.2.1.RELEASE.jar lib/spring-aop-5.2.1.RELEASE.jar l
 ib/spring-context-5.2.1.RELEASE.jar lib/spring-expression-5.2.1.RELEA
 SE.jar lib/slf4j-api-1.7.29.jar lib/spring-core-5.2.1.RELEASE.jar lib
 /spring-jcl-5.2.1.RELEASE.jar
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.1.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

這樣,當打出來的應用jar包,跟依賴jar包的lib文件夾放在同一個目錄下時,使用java -jar就可以運行應用jar包了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章