Java13和Java8中的交叉编译

Java13和Java8中的交叉编译,java,java-8,cross-compiling,java-compiler-api,java-13,Java,Java 8,Cross Compiling,Java Compiler Api,Java 13,我想加载一个特定于Java版本的JavaCompiler 以下是我当前获取编译器实例的方式: JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 我的目标是根据最初编写的Java版本(Java8或Java13)编译“用户Java代码” 我正在用Java8构建我的全部源代码 因此,我得到的编译器实例将是特定于Java 8的,我无法编译Java 13代码(如果我错了,请纠正我) 我已经安装了Java8和Java13 我读了下面

我想加载一个特定于Java版本的
JavaCompiler

以下是我当前获取编译器实例的方式:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
我的目标是根据最初编写的Java版本(Java8或Java13)编译“用户Java代码”

我正在用Java8构建我的全部源代码

因此,我得到的
编译器
实例将是特定于Java 8的,我无法编译Java 13代码(如果我错了,请纠正我)

我已经安装了Java8和Java13

我读了下面的声明

在这种情况下,ToolProvider将定位默认编译器。也是 可以使用服务查找替代编译器或工具 提供者机制

是否有任何方法可以加载特定于Java版本的Java编译器? 有解决办法吗


或者,如果我使用Java 13构建项目,那么我可以使用Java 13编译器的
--target
--source
--release
参数编译特定版本吗

我还没有尝试过这一点,但下面的代码片段可能会让您有所收获:

JavaCompiler eclipseCompiler = ServiceLoader.load(org.eclipse.jdt.internal.compiler.tool.EclipseCompiler.class).iterator().next();
要构建应用程序,只需将以下内容添加到依赖项中(以maven坐标表示):

org.eclipse.jdt
欧洲法院
3.21.0

这将在Java 8上运行,并允许您的应用程序针对法规遵从性13进行编译。

因此,我使用的最后一种方法是:

第1步:

同时安装Java 8和Java 13

第二步:

将Java 13设为默认值

javac
java

第三步:

用Java 13构建项目

第4步:

使用Java13编译器编译Java8和Java13程序

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
它将为您提供Java13编译器

第五步:

编译时,我使用了
--release
选项

您必须指定

——针对Java13的13版
(或者您没有太多,因为编译器仅限于Java13)

——针对Java 8的第8版

步骤6:用于执行类文件:

java 8执行的java 8执行路径

例如:

path_to_java_8/java Helloworld
对于Java 13执行,您可以直接使用
Java
命令,因为Java 13是默认的

java Helloworld

您是否尝试过从Java13查看
JavaCompiler
支持哪些版本?我不知道,但是如果你只是用13来构建你的项目,那么所有以前的版本都会得到支持,就像编译器通常的情况一样(据我所知)。事实上,我有一个用java 8构建的项目,所以我只得到java 8版本,而getSourcecVersions则更少。是的,也许我可以用Java13构建。但我的目标是从一个用Java8构建的项目中获得Java13的编译器。我将尝试使用java 13构建。您不需要使用java 13构建项目,相关的问题是在哪个版本上运行使用
JavaCompiler
的代码。然后,您需要一个支持编译java 13代码的兼容java 8的编译器实现。JDK 8附带的实现没有。Eclipse编译器
ecj
仍然在Java 8上运行,最新版本支持编译Java 1.3版。。。14
java Helloworld