0

我正在制作需要动态创建 java 字节码的软件,甚至可能使它成为一个可运行的 jar。

我目前的想法是创建一个新的 .java 文件并在运行时编译它。我可以创建文件,但我不确定如何在运行时编译它,并使其成为可运行的 jar。任何帮助将不胜感激。

public static String generate(String filePath) {
    try {
        File file = new File("Test.java");
        if(!file.exists())file.createNewFile();
        FileWriter write = new FileWriter(filePath+".java");
        BufferedWriter out = new BufferedWriter(write);
        out.write(
                "public class Test {\n\t" +
                    "public static void main(String[] args){\n\t\t"+
                        "System.out.println(\"Working\");\n\t"+
                    "}\n" +
                "}"

                );
        out.close();

    } catch (Exception e) {// Catch exception if any
        return "Error: " + e.getMessage();
    }
    return "Test.java created!";
}
4

2 回答 2

7

要编译 Java 代码,您可以使用Java Compiler API

要直接生成字节码,可以使用ASM等工具。

要生成可执行 JAR,请创建一个JarOutputStream,其中包含声明主类的清单。

于 2012-08-03T09:04:29.207 回答
1

您当然可以使用 ASM 等,但不要在 jvm 上打折脚本语言。如果您对 vm 和一般字节码不太熟悉,ASM 可能会让人感到困惑。您可以将 groovy 或 jython(或任何您喜欢的语言)代码生成到文件中,并将其与主程序一起打包到 jar 文件中。

例如,您创建一个主程序,它查找类路径资源并将其发送到 groovy 脚本语言:

Binding binding = new Binding();
// maybe set some binding variables here
GroovyShell shell = new GroovyShell(binding);
GroovyCodeSource source = 
  new GroovyCodeSource(
    Thread.currentThread().getContextClassLoader().getResource("script.groovy"));

Object value = shell.evaluate(source);

一旦你有了它,就很容易将主类和脚本打包到一个可执行的 jar 中。您甚至可以解压缩 groovy-all.jar 并将其打包到您的 jar 中,使其成为一个完全自包含的可执行 jar 文件。

这一切都归结为你想要完成的事情,任何一种方法都可能对你有用。

于 2012-08-03T13:43:52.183 回答