【问题标题】:Cross Compilation in Java 13 and Java 8Java 13 和 Java 8 中的交叉编译
【发布时间】:2020-04-03 11:47:57
【问题描述】:

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

这是我目前获取编译器实例的方式:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

我的目标是根据最初编写它的 Java 版本(Java 8 或 Java 13)编译“用户 Java 代码”。

我正在使用 Java 8 构建我的整个源代码。

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

我同时安装了 Java 8 和 Java 13。

我从this article阅读了以下声明

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

有什么方法可以加载特定于 Java 版本的 Java 编译器? 有解决办法吗?

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

【问题讨论】:

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

标签: java java-8 cross-compiling java-compiler-api java-13


【解决方案1】:

我还没有尝试过,但是下面的 sn-p 可能会让你继续前进:

JavaCompiler eclipseCompiler = ServiceLoader.load(org.eclipse.jdt.internal.compiler.tool.EclipseCompiler.class).iterator().next();

要构建您的应用程序,您只需将以下内容添加到您的依赖项(以 maven 坐标给出):

<groupId>org.eclipse.jdt</groupId>
<artifactId>ecj</artifactId>
<version>3.21.0</version>

这将在 Java 8 上运行,并允许您的应用程序编译符合 13。

【讨论】:

    【解决方案2】:

    所以我最后使用的方法是:

    第 1 步:

    同时安装 Java 8 和 Java 13。

    第 2 步:

    使 Java 13 默认

    javacjava

    第 3 步:

    构建在 Java 13 中的项目

    第 4 步:

    使用 Java 13 编译器编译 Java 8 和 Java 13 程序。

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    

    它将为您提供 Java 13 编译器。

    第 5 步:

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

    你必须指定

    --release 13 用于 Java 13(或者你也没有,因为编译器仅限 Java 13)

    --release 8 用于 Java 8。

    第 6 步: 执行类文件:

    java 8 执行的 java 8 执行路径。

    例如:

    path_to_java_8/java Helloworld
    

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

    java Helloworld
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多