注:请不要不上交叉编译的所有危险评.谢谢.
我有一种情况,我们需要为Java 5 JVM编译Java 6源代码(以确保JAX-WS的使用是正确的).以前我们用ant ant脚本(显然可以)这样做了,但是在迁移到Maven之后我们发现它最终以javac抱怨:
$ javac -source 1.6 -target 1.5
javac: source release 1.6 requires target release 1.6
Run Code Online (Sandbox Code Playgroud)
是否有任何对Linux(Ubuntu的11.10,86),其中使用javac可以做到这一点的Java分配?
编辑:它似乎没有,因为限制在javac是相同的.解决方案(这使得需要消失)是从默认的javac编译器改为maven-compiler-plugin中的eclipse编译器.
编辑:我发现Eclipse编译器为javadoc实用程序不同意的匿名内部类生成字节代码.我正在为此问题准备一份错误报告.
POM包含(如/sf/answers/1567929891/中所述):
<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>
Run Code Online (Sandbox Code Playgroud)
$JAVA5_HOME 设置:
• echo $JAVA5_HOME
/usr/lib/jvm/jdk1.5.0_22
Run Code Online (Sandbox Code Playgroud)
据我所知,Java + Maven的神奇之处在于,它应该是maven-compiler-plugin指示JDK 1.8伪装成JDK 1.5并使用Java 5引导类路径的有效咒语.
根据为什么javac在@Override注释上失败,JDK 1.5将不允许接口的已 …
Java 10引入了本地类型推理,这非常酷:
var list = new ArrayList<String>(); // Compiles fine
Run Code Online (Sandbox Code Playgroud)
但是,似乎人们不愿意在新版本发布的那一天(周,月,年)更新他们的Java版本.
这意味着我需要等到Java 8的EOL才可以使用,List.of(1, 2, 3)如果想要支持使用旧Java版本的大多数用户.
另一方面,当编译为字节码时,可能会推断出本地类型推断,因此可能使用它的程序可能会在较旧的Java版本(9或8)上运行.另一方面,Java似乎喜欢在运行时进行优化,这可能意味着类型推断需要JRE版本10.
有人试过这个吗?使用类型推断的程序是否在较旧的Java版本上运行?
感谢您的意见.