我有一个我很困惑的问题。
我知道J ava R untime E nviroment 和J ava D evelopement K it 之间的区别。
我正在编写一个程序,该程序使用该ToolProvider.getSystemJavaCompiler()
方法从代码中编译 java 代码。
现在,我得到答复,如果我的客户端没有安装 JDK,我将无法从客户端编译代码。我的主要问题是,我该怎么做?我不希望我的客户为了运行我的程序而不得不在他们的计算机上安装 JDK。
提前致谢!
我有一个我很困惑的问题。
我知道J ava R untime E nviroment 和J ava D evelopement K it 之间的区别。
我正在编写一个程序,该程序使用该ToolProvider.getSystemJavaCompiler()
方法从代码中编译 java 代码。
现在,我得到答复,如果我的客户端没有安装 JDK,我将无法从客户端编译代码。我的主要问题是,我该怎么做?我不希望我的客户为了运行我的程序而不得不在他们的计算机上安装 JDK。
提前致谢!
Eclipse 的编译器也值得一看。
这里还有一个so问题。
你需要在你的系统上编译它,并将对应的java源文件的class文件分发给任何人。
该类文件不需要 JDK,但必须在该系统上安装 JRE 才能运行该类文件。
如果你想编译代码,你需要一个编译器,所以如果不能期望用户拥有你需要的编译器,你只需要捆绑它。
我真的不能说我知道如何捆绑标准javac
编译器,尽管严格来说,找到包含它的 Jar 文件并将其与您的代码捆绑在一起是可能的。不过,不知道这样的解决方案会有多强大。
但根据您的需要,您可能不需要标准javac
. 那里有大量字节码生成库,或多或少具有高级功能。我真的不想推荐任何我没有个人经验的东西,但例子包括Byte Buddy或ASM。您也可以使用ABCL。
因此,除非您将编译器本身与您的应用程序捆绑在一起,或者除非您找到一个已经包含所有 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 编译器,我向您保证,这对一个人来说绝非易事人。