Compiling/running .java 文件在运行时与反射

Compiling/running .java files at runtime vs. reflection

所以我遇到了这个问题。我们使用 Java 作为我们的 'scripting' 语言,因为我们已经将它用于其他一切,并且它不需要任何额外的第 3 方库。

目前我们正在通过反射执行运行时间代码。类似于:

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 文件。这是我以前从未做过的事情,所以我对如何以对最终用户安全的方式去做这件事有点不知所措。

我发现了这种方法: Generating, compiling and using Java code at run time?

但我不希望大多数最终用户设置 PATH 等等,所以我担心这些解决方案可能 运行 在那里出现问题。这里的理想方法是什么?

使用Runtime.getRuntime().exec("javac SomeFile.java")通过命令行编译Java个文件。

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

But I'm not expecting most end users to have PATH setup and all that, so I'm concerned that these solutions could run into problems there.

使用 javax.tools 方法(在您链接到的问答中描述)不需要用户设置 $PATH$JAVA_HOME$CLASS_PATH。 AFAIK,它只需要用户 运行 java 来自 JDK 安装。

Java 最终使用了 Nashorn JS 引擎。工作起来很有魅力!脚本更改不需要构建时工作流。