Maven Plugin fork 在 pom.xml中的作用

Maven的fork配置用于在编译时启动新的JVM实例,以解决如项目需要特定JDK版本或编码格式导致的问题。当fork设置为true时,编译过程将在独立的JVM中进行,这可能导致速度变慢但提供了更好的隔离性。文章举例说明了如何通过fork解决使用低版本JDK和非UTF-8编码的场景,并指出了未指定executable时可能出现的不确定性。尽管如此,由于资源消耗增加,这种方法并不适用于所有情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Spring-boot 的热加载 devtools开发工具时,团队中有些同事的电脑会不生效。无意中发现有人给了这样一个解决方案:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.9.RELEASE</version>
                <configuration>
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

于是在加了一个 <fork>true</fork> 还真的解决了问题。

fork 这个单词,程序员朋友应该不会陌生,在 Github 上,3大按钮,最后一个就是 Fork

在Maven 插件中,这个 fork 到底寓意何为?
于是找了很多资料,渐渐弄清楚了原委。


fork 的含义

这里的 fork 设置为 true,实际上是会在 maven 编译的时候新创建一个虚拟机执行。这个新创建 JVM 就是这里的 fork。
它速度会稍慢一些,但是隔离性非常好。

fork 使用场景

在我们的开发机器上,一般是安装 maven 的,如果你使用 mvn -v 指令去查看信息,会发现默认的 maven 使用的电脑上 1.8 的 jdk,并且编码方式为 UTF-8.

C:\Users\develop>mvn -v
Apache Maven 3.6.3
Maven home: E:\devtool\apache-maven-3.6.3\bin\..
Java version: 1.8.0_261, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_261\jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

但是有时候,项目可能需要使用 jdk 1.6 去编译,使用不同的JDK就可以创建 fork 一个 JVM 去编译。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <verbose>true</verbose>
          <fork>true</fork>
          <executable>C:\Program Files\Java\jdk1.6.0_33</executable>
          <compilerVersion>1.3</compilerVersion>
        </configuration>
      </plugin>

上面的 maven 3.8.1 版本要求 jdk至少 1.8 以上,但是我的项目又只能跑在 jdk1.6 中,这是上面的方案无疑是较好的解决了该问题。 maven 本身是运行在 jvm 之上的,编译项目的 jdk 可以和运行 maven 的 jdk 不同。

注意,fork 的时候如果不指定 executable参数, maven 将可能会使用 PATH 中任意 jdk来执行。

又或者使用 GBK 等其他编码方式,使用默认的 maven 就会产生乱码,此时也可以 fork 一个 JVM.

还有,如果你想修改JVM 的一些参数,那你还可以通过下面的方式指定 JVM 参数

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
      <fork>true</fork>
      <meminitial>128m</meminitial>
      <maxmem>1024m</maxmem>
      <compilerArgs>
        <arg>-XX:MaxPermSize=256m</arg>
      </compilerArgs>
    </configuration>
</plugin>

总结

默认情况下 ,fork 是 false,Maven 使用 运行自己的 jdk (maven 是需要依赖 jdk 存在的) 来进行 compiler , 如果不想使用这个默认的 jvm,就可以通过 fork 来实现。fork 需要消耗更多的资源,以及花费更多的时间进行编译,所以如果开发机器性能不高,也应该 尽量避免 使用这种方式。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cj96248

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值