使用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 需要消耗更多的资源,以及花费更多的时间进行编译,所以如果开发机器性能不高,也应该 尽量避免 使用这种方式。
--end--