2012-08-03 3 views
0

Je suis en train de créer un logiciel qui va devoir créer dynamiquement du bytecode java, et peut-être même en faire un pot runnable.Créer dynamiquement java bytecode et jn runnable

Mon idée actuelle est de créer un nouveau fichier .java et de le compiler au moment de l'exécution. Je peux créer le fichier, mais je ne suis pas sûr de savoir comment le compiler au moment de l'exécution, et en faire un pot exécutable. Toute aide serait grandement appréciée.

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

Si vous créez le code d'octet en mémoire, vous pouvez le charger directement dans votre ClassLoader sans avoir à écrire de fichiers. –

Répondre

6

Pour compiler le code Java, vous pouvez utiliser le Java Compiler API.

Pour générer un code d'octet directement, vous pouvez utiliser des outils tels que ASM. Pour générer un JAR exécutable, créez un JarOutputStream avec un manifest that declares the main class.

+0

Merci! J'ai fini par créer le fichier Java, le compiler, puis construire un pot. Merci encore! –

1

Vous pouvez certainement utiliser ASM et autres, mais ne négligez pas les langages de script sur jvm. ASM peut être déroutant si vous n'êtes pas très familier avec le vm et le bytecode en général. Vous pouvez générer du code groovy ou jython (ou quel que soit le langage que vous aimez) dans un fichier, et l'empaqueter avec un programme principal dans un fichier jar.

À titre d'exemple, vous créez un programme principal qui recherche une ressource classpath et l'envoie hors du langage de script 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); 

Une fois que vous avez cela, il serait facile d'emballer la principale classe et le script dans un fichier exécutable. Vous pouvez même déballer le groovy-all.jar et l'emballer dans votre pot pour en faire un fichier jar exécutable entièrement autonome.

Tout se résume à ce que vous essayez d'accomplir, et l'une ou l'autre approche fonctionnerait probablement pour vous.