【问题标题】:Dynamically create java bytecode and runnable jar动态创建 java 字节码和可运行的 jar
【发布时间】:2012-08-01 07:29:54
【问题描述】:

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

【问题讨论】:

  • 如果您在内存中创建字节码,您可以直接将其加载到您的 ClassLoader 中,而无需编写任何文件。

标签: java dynamic jar bytecode


【解决方案1】:

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

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

要生成可执行 JAR,请创建带有 manifest that declares the main class 的 JarOutputStream。

【讨论】:

  • 谢谢!我最终创建了 java 文件,编译它,然后构建一个 jar。再次感谢!
【解决方案2】:

您当然可以使用 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 文件。

这一切都归结为您要完成的工作,任何一种方法都可能适合您。

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2019-11-08
    • 2010-11-14
    • 2011-12-30
    • 2011-01-06
    • 2014-04-01
    相关资源
    最近更新 更多