Java Maven 构建源和目标不工作
Java Maven build source and targe is not working
我的电脑上安装了 JDK 7 和 8。
我尝试将 JAVA_HOME
设置为 JDK 8,在 Maven pom 文件中,我设置为 1.7,如下所示:
<properties>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.source>1.7</maven.compiler.source>
</properties>
我在 maven 构建过程中遇到以下错误:
incomparable types: boolean and java.lang.Object
源代码为:
Map mapData = (LinkedHashMap)it.next();
if(true == mapData.get("isTrueOrFalse")){ // java 8 doesn't allow this, it have to be [true == (boolean)mapData.get("isTrueOrFalse")]
xxx
}
我无法更改源代码,所以我将 JAVA_HOME
更改为 JDK 7,maven pom 保持为 1.7。然后我就可以通过Maven成功构建了。
我的理解是,通过设置源和目标,它应该允许我编译到较低兼容的 Java 版本,但事实并非如此。谁能帮忙解释一下?
Apache Maven 页面说:
Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version (...) In the same way, setting the source option does not guarantee that your code actually compiles on a JDK with the specified version
您可以先尝试直接配置插件(而不是 pom.xml 上的插件):
<plugins>
<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><!-- path-to-javac --></executable>
<compilerVersion>1.7</compilerVersion>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
经过多次搜索 Java 兼容性 post,我发现发生这种情况的两个可能原因:
1) 这是 JDK 7 中的错误,它不应该允许 JDK 7 编译它,因为类型不匹配。这个在JDK8中已经固定了,所以即使我们用-source=1.7
和-target=1.7
也是不允许通过的。 JDK 1.7 breaks backward compatibility? (generics)
2) 这可能是由于 Java 实现 return 类型不兼容,而使用 JDK 8 编译为 -source=1.7
和 -target=1.7
,构建路径 (bootstrap 类) 仍将指向 JDK 8,因此 Java Map
的实现可能 return 不同的类型导致上述问题。
我的电脑上安装了 JDK 7 和 8。
我尝试将 JAVA_HOME
设置为 JDK 8,在 Maven pom 文件中,我设置为 1.7,如下所示:
<properties>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.source>1.7</maven.compiler.source>
</properties>
我在 maven 构建过程中遇到以下错误:
incomparable types: boolean and java.lang.Object
源代码为:
Map mapData = (LinkedHashMap)it.next();
if(true == mapData.get("isTrueOrFalse")){ // java 8 doesn't allow this, it have to be [true == (boolean)mapData.get("isTrueOrFalse")]
xxx
}
我无法更改源代码,所以我将 JAVA_HOME
更改为 JDK 7,maven pom 保持为 1.7。然后我就可以通过Maven成功构建了。
我的理解是,通过设置源和目标,它应该允许我编译到较低兼容的 Java 版本,但事实并非如此。谁能帮忙解释一下?
Apache Maven 页面说:
Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version (...) In the same way, setting the source option does not guarantee that your code actually compiles on a JDK with the specified version
您可以先尝试直接配置插件(而不是 pom.xml 上的插件):
<plugins>
<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><!-- path-to-javac --></executable>
<compilerVersion>1.7</compilerVersion>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
经过多次搜索 Java 兼容性 post,我发现发生这种情况的两个可能原因:
1) 这是 JDK 7 中的错误,它不应该允许 JDK 7 编译它,因为类型不匹配。这个在JDK8中已经固定了,所以即使我们用-source=1.7
和-target=1.7
也是不允许通过的。 JDK 1.7 breaks backward compatibility? (generics)
2) 这可能是由于 Java 实现 return 类型不兼容,而使用 JDK 8 编译为 -source=1.7
和 -target=1.7
,构建路径 (bootstrap 类) 仍将指向 JDK 8,因此 Java Map
的实现可能 return 不同的类型导致上述问题。