0

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

2 に答える 2

7

Java コードをコンパイルするには、Java コンパイラ APIを使用できます。

バイト コードを直接生成するには、ASMなどのツールを使用できます。

実行可能な JAR を生成するには、メイン クラスを宣言するマニフェストを使用してJarOutputStreamを作成します。

于 2012-08-03T09:04:29.207 に答える
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ファイルにすることもできます。

それはすべてあなたが達成しようとしていることに要約され、どちらのアプローチもおそらくあなたのために働くでしょう。

于 2012-08-03T13:43:52.183 に答える