一、pom文件配置html
1.1 添加maven-dependency-plugin插件用於將引用的jar包拷貝到指定的路徑,便於後續tomcat啓動指定依賴包路徑java
<!--拷貝依賴到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>
使用這個插件構建完以後的目錄結構多了一個lib目錄(即上述配置的outputDirectory指定的路徑),裏面是依賴的jar包:spring
1.2 springboot項目使用spring-boot-maven-plugin打包插件apache
<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>
配置上述打包以後就會排除相應的jar包,使得由插件打成的Flat jar包大小變小,便於上傳服務器發佈,效果以下,BOOT-INF目錄下的lib目錄沒有了:tomcat
原先打成的jar包裏的結構爲springboot
而後在啓動項目時指定jar包路徑-Dloader.path="../lib",這樣就能夠達到瘦身效果了,其中依賴放在D:develop/shared/fjar目錄下,執行運行命令服務器
java -Dloader.path="D:develop/shared/fjar" -jar mytest.jar
附註:另一種啓動方案是能夠不加-Dloader.path="D:develop/shared/fjar"來指定路徑,直接使用以下指令啓動maven
java -jar mytest.jar
使用上述啓動的話須要添加maven-jar-plugin插件,配置<classpathPrefix>屬性,另外在處理一些讀取可執行jar中的文件時,可使用maven-jar-plugin插件替換spring-boot-maven-plugin進行打包操做spring-boot
<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>
上述插件效果就是在打成的包裏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版本衝突問題),示例以下:
注意:
一、使用-Dloader.path須要在打包的時候增長<layout>ZIP</layout>,不指定的話-Dloader.path不生效。對於多個微服務瘦身打包建議使用maven-jar-plugin打包,避免由於spring-boot-maven-plugin打包機制致使的一些應用啓動問題(已踩坑)
二、若存在不一樣版本依賴:好比項目A依賴Y庫的1.0版本,項目B依賴Y庫的2.0版本,那麼可能會出現版本依賴衝突(兩個版本不兼容的狀況下),解決方案:
2.一、能作到版本一致就保持使用同一個版本,保證版本一致。可使用maven的版本依賴管理進行處理,即在父pom文件使用<dependencyManagement>統一管理依賴版本
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
<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>
2.POM不是繼承spring-boot-starter-parent時需指定
<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>
3.POM不是繼承spring-boot-starter-paren,且使用maven-jar-plugin插件來指定執行的類
<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>