解決Springboot打包時,帶入java源文件的問題

解決Springboot打包時,帶入java源文件的問題

一、問題

無意反編譯基於springboot打出的jar包時,發現jar包中包含了java源文件代碼。

二、定位問題

  1. 分析了下執行打包的命令是mvn clean install,這中間實際執行的maven插件較多,如下圖所示。
    mvn clean install涉及插件
  2. 進一步定界,發現是classes目錄下有java源碼所致。誰會把java源碼拷貝至classes目錄呢?
  3. 觀察上述插件的執行過程,很自然想到是maven-resources-plugin在作祟。上述resources插件執行了2次。
  4. 猜想是默認的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>
  1. 爲了驗證這個猜想,同時只讓自己的配置生效,把<id>和<goal>標籤的值分別改成系統默認的default-resources、resources。再次執行,果然發現只執行了1次resources插件。
    在這裏插入圖片描述
  2. 到了這裏,問題基本上已經解決了。是因爲自己配置的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>
  1. 點開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>
  1. 由於時間比較緊,沒有仔細研究。

三、解決方案

  1. 自定義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>
  1. 注意,不要修改<id>和<goal>中的值。

四、收穫總結

  1. 項目中經常會碰到maven插件的問題,尤其是現在maven插件又多,配置又比較複雜。當然我們一般都是使用默認的簡單配置。
  2. 碰到問題的時候,需要靜下心來仔細研究下,找出問題的根本原因,真正的解決方案也並不會太複雜。

五、參考資料

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