解决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. 碰到问题的时候,需要静下心来仔细研究下,找出问题的根本原因,真正的解决方案也并不会太复杂。

五、参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值