【发布时间】:2016-10-14 12:12:06
【问题描述】:
- 我有一个旧版 Java 5 项目,至少在 2017 年 12 月 31 日之前该项目仍将被维护。
- 我的默认系统 JDK 是 1.8。
- 还安装了JDK 1.5,如Install Java 5 in Ubuntu 12.04 和https://askubuntu.com/questions/522523/how-to-install-java-1-5-jdk-in-ubuntu 中所述。
POM 包含(如https://stackoverflow.com/a/22398998/766786 中所述):
<profile>
<id>compileWithJava5</id>
<!--
NOTE
Make sure to set the environment variable JAVA5_HOME
to your JDK 1.5 HOME when using this profile.
-->
<properties>
<java.5.home>${env.JAVA5_HOME}</java.5.home>
<java.5.libs>${java.5.home}/jre/lib</java.5.libs>
<java.5.bootclasspath>${java.5.libs}/rt.jar${path.separator}${java.5.libs}/jce.jar</java.5.bootclasspath>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<compilerArguments>
<bootclasspath>${java.5.bootclasspath}</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>
</profile>
$JAVA5_HOME 已设置:
• echo $JAVA5_HOME
/usr/lib/jvm/jdk1.5.0_22
据我了解 Java+Maven 的魔力,这应该是 maven-compiler-plugin 的有效咒语,指示 JDK 1.8 伪装成 JDK 1.5 并使用 Java 5 引导类路径。
根据Why is javac failing on @Override annotation,JDK 1.5 将不允许@Override 用于接口 的已实现方法,仅用于超类中存在的重写方法。
在this commit 中,@Override 注释用于interface 的实现方法,因此这是无效的Java 5 代码:
private static class DummyEvent implements PdfPTableEvent {
@Override
public void tableLayout(PdfPTable table, float[][] widths, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
}
}
当我跑步时
mvn clean compile test-compile -P compileWithJava5
在包含@Override 注释的类上没有出现编译错误。我在这里错过了什么?
(已经尝试过:Animal Sniffer Maven Plugin,但是那个插件doesn't look at compilation flags,只在字节码处。)
编辑:这是我目前在 POM 中的内容。
<profile>
<id>compileWithLegacyJDK</id>
<!--
NOTE
Make sure to set the environment variable JAVA5_HOME
to your JDK 1.5 HOME when using this profile.
-->
<properties>
<java.version>1.5</java.version>
<java.home>${env.JAVA5_HOME}</java.home>
<java.libs>${java.home}/jre/lib</java.libs>
<java.bootclasspath>${java.libs}/rt.jar${path.separator}${java.libs}/jce.jar</java.bootclasspath>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArguments>
<bootclasspath>${java.bootclasspath}</bootclasspath>
</compilerArguments>
<compilerVersion>${java.version}</compilerVersion>
<fork>true</fork>
<executable>${java.home}/bin/javac</executable>
</configuration>
</plugin>
</plugins>
</build>
</profile>
运行
export JAVA5_HOME=/var/lib/jenkins/tools/hudson.model.JDK/1.5
mvn compile test-compile -P compileWithLegacyJDK
有关详细信息,请参阅下面接受的答案。
【问题讨论】:
-
请显示相关代码
-
您误会了
source和target。你需要设置一个引导类路径来检测这样的问题:stackoverflow.com/a/25273329/1743880 -
@Jens 我已经添加了一个指向相关代码的链接,以及 POM 中告诉 Java 表现得像 Java 5 的部分。我希望现在问题更清楚了。
-
嗯,这很奇怪。我会尝试设置这样的东西,并重现结果
-
随意克隆问题中链接的 repo。
@Override注释已添加到TableEventTest.java中,并在手动审查代码后在稍后的提交中删除。 CI 应该早点发现它。
标签: java maven cross-compiling jdk1.5