我正在制作需要动态创建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!";
}
答案 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文件。
这一切都归结为你想要完成的事情,任何一种方法都可能适合你。