【问题标题】:java - Compile code on client side without JDKjava - 在没有 JDK 的情况下在客户端编译代码
【发布时间】:2017-03-05 11:09:02
【问题描述】:

我有一个很困惑的问题。

我知道 Java Runtime Enviroment 和 Java 之间的区别D发展K它。

我正在编写一个程序,它使用ToolProvider.getSystemJavaCompiler() 方法从代码中编译java 代码。

现在,我得到答复,如果我的客户端没有安装 JDK,我无法从客户端编译代码。我的主要问题是,如何我能做到这一点?我不希望我的客户为了运行我的程序而不得不在他们的计算机上安装 JDK。

提前致谢!

【问题讨论】:

  • 仅使用 JRE 在虚拟机中运行 os 并尝试运行已编译的程序
  • 如果您知道其中的区别,那么您认为 JRE 对用户来说不够用的原因是什么?
  • 为什么你认为没有JDK就可以在用户电脑上编译代码?
  • @SLaks 好的,那么答案是肯定的。我会换个问题。

标签: java java-compiler-api javacompiler


【解决方案1】:

你需要在你的系统上编译它,并将对应的java源文件的class文件分发给任何人。

该类文件不需要 JDK,但必须在该系统上安装 JRE 才能运行该类文件。

【讨论】:

  • 不适用于getSystemJavaCompiler。阅读问题。
  • 是的,之前情况不同。 :) 不过,简单来说,除非您拥有 javac,即 JDK 附带的,否则您无法编译代码。希望它能解决您的问题。
【解决方案2】:

如果你想编译代码,你需要一个编译器,所以如果不能期望用户拥有你需要的编译器,你只需要捆绑它。

我真的不能说我知道如何捆绑标准的javac 编译器,但严格来说,可能可能找到包含它的 Jar 文件并将其与您的代码。不过,不知道这样的解决方案会有多强大。

但根据您的需要,您可能不需要标准的javac。那里有大量的字节码生成库,或多或少具有高级功能。我真的不想推荐任何我没有个人经验的东西,但例子包括Byte BuddyASM。你也可以使用ABCL

【讨论】:

    【解决方案3】:

    Eclipse's compiler 也值得一看。

    还有一个so问题here

    【讨论】:

      【解决方案4】:

      因此,除非您将编译器本身与您的应用程序捆绑在一起,或者除非您找到一个已经包含所有 Java 编译器代码的库,否则您确实没有办法做您想做的事情。不必使用JDK编译器,你不会得到你想要的,而你想要的是能够将包含源代码的String变成Java类。

      我不明白你想要完成什么,但我能给你的最好的选择是 asm。如果您准备好完成这项任务,您可以在运行时手动编写新类,而无需 JDK 编译器。但是,这并不涉及您使用充满源代码的字符串并将其转换为 Class 对象。这是您在大部分情况下使用 Java 字节码的底层工作。

      本教程可以帮助您入门: https://www.javaworld.com/article/2071777/design-patterns/add-dynamic-java-code-to-your-application.html

      这里是类文件的 Java 文档。您可以使用它来扩展您从第一个链接中学到的知识: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

      这是我能给你的唯一一个动态创建类的实例。话虽如此,您可以尝试编写自己的 Java 编译器,它可以将源代码转换为类,而无需获得 Java 编译器,但此时您实际上是在自己重新创建 Java 编译器,我向您保证,这对一个人来说绝非易事人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多