一、問題
無意反編譯基於springboot打出的jar包時,發現jar包中包含了java源文件代碼。
二、定位問題
- 分析了下執行打包的命令是mvn clean install,這中間實際執行的maven插件較多,如下圖所示。
- 進一步定界,發現是classes目錄下有java源碼所致。誰會把java源碼拷貝至classes目錄呢?
- 觀察上述插件的執行過程,很自然想到是maven-resources-plugin在作祟。上述resources插件執行了2次。
- 猜想是默認的resources插件使用了1次,我本地的配置又執行了1次。我本地配置如下:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
- 爲了驗證這個猜想,同時只讓自己的配置生效,把<id>和<goal>標籤的值分別改成系統默認的default-resources、resources。再次執行,果然發現只執行了1次resources插件。
- 到了這裏,問題基本上已經解決了。是因爲自己配置的resources插件和默認的配置不一致,導致執行了2遍,默認的始終會把java文件打入classes目錄下。這是因爲我的maven工程的pom.xml配置了springboot爲父pom。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/>
</parent>
- 點開spring-boot-starter-parent的配置(按住ctrl鍵,鼠標移動到spring-boot-starter-parent文字上,我目前使用的是idea)。發現springboot下的resources插件配置如下:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimiter>${resource.delimiter}</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
- 由於時間比較緊,沒有仔細研究。
三、解決方案
- 自定義resources插件的配置,覆蓋mvn默認的配置:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>default-resources</id>
<phase>process-sources</phase>
<goals>
<goal>resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
- 注意,不要修改<id>和<goal>中的值。
四、收穫總結
- 項目中經常會碰到maven插件的問題,尤其是現在maven插件又多,配置又比較複雜。當然我們一般都是使用默認的簡單配置。
- 碰到問題的時候,需要靜下心來仔細研究下,找出問題的根本原因,真正的解決方案也並不會太複雜。
五、參考資料
無