一、pom文件配置
1.1 添加maven-dependency-plugin插件用於將引用的jar包拷貝到指定的路徑,便於後續tomcat啓動指定依賴包路徑
<!--拷貝依賴到jar外面的lib目錄-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--指定的依賴路徑-->
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
[](javascript:void(0)😉
使用這個插件構建完之後的目錄結構多了一個lib目錄(即上述配置的outputDirectory指定的路徑),裏面是依賴的jar包:
1.2 springboot項目使用spring-boot-maven-plugin打包插件
[](javascript:void(0)😉
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<layout>ZIP</layout>
<mainClass>
com.iasp.BasicStarter
</mainClass>
<!--只包含自己-->
<includes>
<include>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
</include>
<!--或者-->
<!--依賴jar不打進項目jar包中-->
<!--<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>-->
</includes>
<!--不包含哪些-->
<!--<excludeGroupIds>-->
<!--com.hundsun.jrescloud,-->
<!--org.springframework.boot,-->
<!--org.springframework-->
<!--</excludeGroupIds>-->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
[](javascript:void(0)😉
配置上述打包之後就會排除相應的jar包,使得由插件打成的Flat jar包大小變小,便於上傳服務器發佈,效果如下,BOOT-INF目錄下的lib目錄沒有了:
原先打成的jar包裏的結構爲
然後在啓動項目時指定jar包路徑-Dloader.path="../lib",這樣就可以達到瘦身效果了,其中依賴放在D:develop/shared/fjar目錄下,執行運行命令
java -Dloader.path="D:develop/shared/fjar" -jar mytest.jar
附註:另外一種啓動方案是可以不加-Dloader.path="D:develop/shared/fjar"來指定路徑,直接使用如下指令啓動
java -jar mytest.jar
使用上述啓動的話需要添加maven-jar-plugin插件,配置
[](javascript:void(0)😉
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!--addClasspath表示需要加入到類構建路徑-->
<addClasspath>true</addClasspath>
<!--classpathPrefix指定生成的Manifest文件中Class-Path依賴lib前面都加上路徑,構建出lib/xx.jar-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.common.util.CommonUtilsApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
[](javascript:void(0)😉
上述插件效果就是在打成的包裏META_INF目錄下的MANIFEST.MF文件裏增加Class-path對應jar,這樣在後面應用剛啓動時就會根據Class-Path的只去加載需要的版本依賴(解決在共享目錄裏存在多版本加載引用衝突問題),這個效果就等效加參數-classpath xxx(具體的jar)。此時就是將需要的jar目錄lib放在和要運行的xxx.jar同級目錄即可,啓動時就可以不加-Dloader.path參數了,如果lib目錄和要運行的xxx.jar不在同級目錄的話,則需要使用-Dloader.path來啓動
如下:在同一級目錄啓動
不在同一級目錄啓動:
其中-Dloader.path可以指定多個目錄,這樣在存在多個微服務情況下可將一些公共用到的jar放在一個共享目錄中,每個微服務獨有的jar可以放在微服務私有的目錄下(解決jar版本衝突問題),示例如下:
注意:
1、使用-Dloader.path需要在打包的時候增加
2、若存在不同版本依賴:比如項目A依賴Y庫的1.0版本,項目B依賴Y庫的2.0版本,那麼可能會出現版本依賴衝突(兩個版本不兼容的情況下),解決方案:
2.1、能做到版本一致就保持使用同一個版本,保證版本一致。可以使用maven的版本依賴管理進行處理,即在父pom文件使用
2.2、讓項目各自依賴所需的版本並打進war包中,把其他同版本的jar包放在同一個共享包下
測試發現依賴在查找時從上往下找,匹配到就用第一個,如下圖會使用comm-0.0.1.jar版本的
附註:
使用spring-boot-maven-plugin插件,會將依賴的jar包全部打包進去,這樣就可以直接運行生成的 JAR 包,簡化了我們開發操作。
使用spring-boot-maven-plugin插件如果不指定程序主運行入口類的話默認爲Main-Class: org.springframework.boot.loader.JarLauncher
這個可以自定義執行主入口類,有以下幾種方式:
1.POM繼承spring-boot-starter-parent
[](javascript:void(0)😉
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<!-- The main class to start by executing java -jar -->
<start-class>ccom.notes.JavaNotesApplication</start-class>
</properties>
[](javascript:void(0)😉
2.POM不是繼承spring-boot-starter-parent時需指定
[](javascript:void(0)😉
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.9.RELEASE</version>
<configuration>
<mainClass>com.notes.JavaNotesApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
[](javascript:void(0)😉
3.POM不是繼承spring-boot-starter-paren,且使用maven-jar-plugin插件來指定執行的類
[](javascript:void(0)😉
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<useUniqueVersions>false</useUniqueVersions>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.notes.JavaNotesApplication</mainClass>
</manifest>
<manifestEntries>
<version>${project.version}</version>
</manifestEntries>
</archive>
</configuration>
</plugin>
[](javascript:void(0)😉