2012-08-03 1 views
0

Я создаю программное обеспечение, которое необходимо будет динамически создавать java-байт-код и, возможно, даже сделать его исполняемым банком.Динамически создавать java байт-код и runnable jar

Моя нынешняя идея - создать новый .java-файл и скомпилировать его во время выполнения. Я могу создать файл, но я не уверен, как его скомпилировать во время выполнения, и сделать его запущенным банком. Любая помощь будет принята с благодарностью.

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!"; 
} 
+1

Если вы создаете байтовый код в памяти, вы можете загрузить его прямо в свой ClassLoader без необходимости писать какие-либо файлы. –

ответ

6

Для компиляции Java-код, вы можете использовать Java Compiler API.

Чтобы генерировать байтовый код напрямую, вы можете использовать такие инструменты, как ASM.

Чтобы создать исполняемый JAR, создайте JarOutputStream с помощью manifest that declares the main class.

+0

Спасибо! Я закончил создание java-файла, скомпилировал его, а затем создал банку. Еще раз спасибо! –

1

Вы можете, конечно, использовать ASM и т. П., Но не запрещаете языки сценариев на jvm. ASM может быть запутанным, если вы не очень хорошо знакомы с vm и байт-кодом в целом. Вы могли бы генерировать код groovy или jython (или любой другой язык, который вам нравится), в файл, и пакет, содержащий основную программу в файле jar.

В качестве примера, вы создаете основную программу, которая ищет пути к классам ресурса и отправляет его на заводной язык сценариев:

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); 

После того, как у вас есть, что было бы легко упаковать основной класс и скрипт в исполняемом банке. Вы даже можете распаковать groovy-all.jar и упаковать его в свою банку, чтобы сделать его полностью автономным исполняемым файлом jar.

Все это сводится к тому, что вы пытаетесь выполнить, и любой подход, вероятно, сработает для вас.

Смежные вопросы