一、问题
无意反编译基于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插件又多,配置又比较复杂。当然我们一般都是使用默认的简单配置。
- 碰到问题的时候,需要静下心来仔细研究下,找出问题的根本原因,真正的解决方案也并不会太复杂。
五、参考资料
无