前言
工作中終于遇到比較好玩的東西了,最近被給了一個需求,將pom中的第三方依賴移到外面而不直接打包進jar包。那直接打包有什么問題嗎?下面我們一起來看看。
直接打包的缺點
首先宣讀一下直接打包的“三大罪”!!!
- 如果項目依賴的第三方包非常多,那么最終提供出去的jar包將非常大,上傳所需時間也非常多
- 如果依賴的第三方包版本升級了,想要直接用最新的版本就只能修改版本然后重新打包了
- 如果依賴的某個第三方包有安全漏洞,那么必須換版本,換版本的話就必須重新進行打包。就暴露出fastjson的安全漏洞,版本小于1.2.68存在反序列化的漏洞
第二點和第三點差不多,都是由版本導致重新打包
但是如果我們打包時不將依賴的第三方包打包進去,那么最后的jar包不僅小,而且當依賴的第三方版本發(fā)生變化時也不需要重新打包了,心動不如行動,現(xiàn)在對自己的項目手起刀落改造一下吧
pom文件的修改
在maven項目中配置打包相關(guān)的東西是在pom文件中的,一般情況下,在pom中如果不需要將第三方包排除在外,都是這樣配置的:
<build>
<finalName>authsdk-service-${version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>authsdk-service-${version}</finalName>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
看一下打包后jar包的大小
大小為27515KB,可以發(fā)現(xiàn)jar包的內(nèi)容中,在BOOT-INF/lib目錄下都是依賴的第三方包
發(fā)現(xiàn)了嗎?真相只有一個!導致打包出來的jar包大的原因就是這些依賴的第三方包。
那既然問題原因出現(xiàn)了,就可以開始對癥下藥解決問題了,我們對pom文件做一個改動,讓它不將第三方依賴打包進去,修改后的配置:
<build>
<finalName>authsdk-service-${version}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 此處為項目的主類路徑 -->
<mainClass>com.xxx.authsdk.AuthsdkServiceApplication</mainClass>
<layout>ZIP</layout>
<includes>
<include>
<!-- 排除所有的第三方依賴的Jar包 -->
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
修改完后重新打包
jar包大小變?yōu)?702KB,瘦身效果很明顯!!!相比之前直接變小了94%,同時查看jar包內(nèi)容/BOOT-INF下沒有l(wèi)ib文件夾了,確實沒有將第三方依賴打包進去。
那到這里是不是已經(jīng)完事了?不,其實還可以做得更好!因為打包時沒有將第三方依賴打包進去,因此啟動的時候需要指定第三方依賴的位置程序才能正常啟動,這就要求我們必須從最開始未瘦身的jar包中將lib文件夾給摳出來,但這樣的做法就稍微有點low了。maven提供了一種顯示指定lib文件夾保存路徑的方法,在之前的pom文件基礎(chǔ)上加下如下配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 復(fù)制第三方 jar 到指定路徑下 下 -->
<outputDirectory>G:/JAVA工程/authorize_service/lib</outputDirectory>
<excludeScope>provided</excludeScope>
<!-- 配置的作用:跳過復(fù)制第三方依賴這一步。這是在首次上傳
第三方依賴到服務(wù)器之后,啟用這個選項,可以不用在打包時
重復(fù)復(fù)制,節(jié)省時間。-->
<skip>false</skip>
</configuration>
</execution>
</executions>
</plugin>
通過<outputDirectory>指定lib目錄保存路徑為當前項目路徑下
項目啟動
因為沒有將第三方依賴打包進去,因此啟動時必須顯示指定第三方依賴路徑
- 相對路徑:java -Dloader.path=lib -jar xxx.jar
- 絕對路徑:java -Dloader.path=/xxx/lib -jar xxx.jar
最后
Java的學習是一條漫長的道路,每個地方都是值得學習的內(nèi)容。
在實際工作中,我們會遇到各種各樣的需求,但是不要慌!只要我們靜下心來,弄清需求,理清邏輯,打磨細節(jié),做到這三點,絕大部分的難題都可以迎刃而解。