动态创建java字节码和可运行的jar

时间:2012-08-03 08:57:12

标签: java dynamic jar bytecode

我正在制作需要动态创建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!";
}

2 个答案:

答案 0 :(得分:6)

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

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

要生成可执行JAR,请使用JarOutputStream创建manifest that declares the main class

答案 1 :(得分: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文件。

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