运行时编译/运行.java文件与反射

运行时编译/运行.java文件与反射,java,reflection,runtime,Java,Reflection,Runtime,所以我遇到了这个问题。我们使用Java作为我们的“脚本”语言,因为我们已经将它用于其他所有事情,并且它不需要任何额外的第三方LIB 现在,我们正在通过反射执行运行时代码。比如: Class triggerAction = null; try { triggerAction = Class.forName(actionName); Gdx.app.log("Info", triggerAction.getName() + " attached to "

所以我遇到了这个问题。我们使用Java作为我们的“脚本”语言,因为我们已经将它用于其他所有事情,并且它不需要任何额外的第三方LIB

现在,我们正在通过反射执行运行时代码。比如:

Class triggerAction = null;
    try {
        triggerAction = Class.forName(actionName);
        Gdx.app.log("Info", triggerAction.getName() + " attached to "
                + this.toString());
        try {
            this.triggerAction = (TriggerAction) triggerAction
                    .newInstance();
        } 
这很好,但并不理想。任何要在运行时运行的java文件都必须编译到最新版本中。理想情况下,非开发人员可以使用存储在“/scripts/”目录中的脚本文件,然后运行程序并执行修改后的.java文件。这是我以前从未做过的事情,所以我有点不知所措,不知道如何以对最终用户安全的方式进行

我发现了这种方法:


但我不希望大多数最终用户都有路径设置和所有这些,所以我担心这些解决方案可能会遇到问题。这里的理想方法是什么

使用
Runtime.getRuntime().exec(“javac SomeFile.java”)
通过命令行编译java文件

如果您不确定路径中是否有
javac
java
,请尝试直接指定完整路径(即
C:\Program Files\java\jdk1.8.0\u xx\bin\javac
),或者直接询问用户路径在哪里

但我不希望大多数最终用户都有路径设置和所有这些,所以我担心这些解决方案可能会遇到问题


使用
javax.tools
方法(在您链接的Q&A中描述)不需要用户设置
$PATH
$JAVA\u HOME
$CLASS\u PATH
。好了,它只需要用户从JDK安装运行
java

最终使用了Nashorn JS engine for java。工作得很有魅力!脚本更改不需要构建时工作流。

我们使用Java作为“脚本”语言等等,什么?Java绝对不是脚本语言。如果要使用脚本语言,请使用JavaScript。使用Java8,您可以获得一个名为的JavaScript引擎的完整Java实现版本,您可以从Java内部调用它。否则,您可以在运行时加载类,但这更复杂,因为您必须创建插件系统和。因此您的问题是“如何在运行时编译Java源文件?”?我不知道Nashorn。这很有趣。但是如何在脚本和java代码库之间进行接口呢?我回答了自己的问题。但这看起来是我们要去的方向。谢谢图灵85。请参阅“从JS调用Java方法”一节。图灵85,如果你想继续,把你的答案贴在下面,那就是我最后采用的方法。嗯,好的。可以使用launch4j包装器。不过,对于重新分发JDK的相关法律问题,我们一无所知。法律问题与JRE的问题相同。(但如果您有疑问,请咨询您的公司律师。)此外,您不需要特殊包装。您的Java应用程序可以在同一个JVM中运行Java编译器。如果最终用户不使用JDK,则不会,对吗?这对我们来说是一个相当大的问题。所以使用launch4j包装一个JDK,至少对我来说是有意义的,除去潜在的法律问题。那么没有安装JDK和没有安装JRE有什么区别呢?实际上,您应该知道,使用launch4j的需求独立于动态编译需求,因为正如我所说,最终用户不倾向于在他们的机器上安装JDK。