如何在scala-maven-plugin中配置使用JDK7编译Scala2.8遗留项目
配置不生效的核心原因
- 你当前配置的
<source>、<target>以及<javacArgs>仅作用于插件调用javac编译Java源码的环节,对Scala编译器scalac本身完全不生效,既不会改变scalac生成的字节码版本,也无法解决兼容性问题。 - Scala 2.8.0版本的
scalac本身仅支持运行在JDK 5/6/7环境下,如果你当前启动Maven的JDK版本是8及以上,scalac运行过程中就会直接出现兼容性错误,和编译参数配置无关。 - 你使用的3.4.2版本
scala-maven-plugin本身已经不再适配Scala 2.8.0这样的历史版本,插件本身的兼容问题也会导致配置不生效。
可行的解决办法
因为你无法直接使用JDK7环境编译,推荐优先使用Maven工具链方案,不需要修改全局环境变量,仅在编译时临时调用JDK7:
方案1:使用maven-toolchains-plugin绑定JDK7
- 提前下载JDK7的压缩包解压到本地任意目录,不需要配置环境变量
- 在你的用户目录下的
.m2文件夹中创建toolchains.xml文件,内容如下:
<toolchains> <toolchain> <type>jdk</type> <provides> <version>1.7</version> <vendor>oracle</vendor> </provides> <configuration> <jdkHome>替换为你本地JDK7解压后的绝对路径</jdkHome> </configuration> </toolchain> </toolchains>
- 在项目pom.xml中增加工具链插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-toolchains-plugin</artifactId> <version>1.1</version> <executions> <execution> <goals> <goal>toolchain</goal> </goals> </execution> </executions> <configuration> <toolchains> <jdk> <version>1.7</version> <vendor>oracle</vendor> </jdk> </toolchains> </configuration> </plugin>
- 将
scala-maven-plugin版本降级到3.2.2(该版本兼容Scala 2.8.0),原有配置中的<source>、<target>、<javacArgs>可以保留,不需要额外配置Scala参数即可正常编译。
方案2:临时调整scalac参数(仅作为备选,兼容性无法保证)
如果无法获取JDK7安装包,可以尝试给scalac指定JVM目标版本,有概率在JDK8环境下编译通过:
<plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <recompileMode>incremental</recompileMode> <source>1.7</source> <target>1.7</target> <javacArgs> <javacArg>-source</javacArg> <javacArg>1.7</javacArg> <javacArg>-target</javacArg> <javacArg>1.7</javacArg> </javacArgs> <!-- 新增scalac参数指定JVM目标版本 --> <scalaArgs> <scalaArg>-target:jvm-1.7</scalaArg> </scalaArgs> </configuration> </plugin>
注意该方案无法完全规避Scala 2.8.0编译器和JDK8的兼容性问题,可能出现编译异常。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

