1

2 つのクラスを生成するコードを作成し、それらをバッファリングして JavaCompiler でコンパイルしました。私のクラスは .java ファイルではこのようになっています。

public class A{
    public A() { }
    public String toString(){ return "A";}
    }

public class B extends ArrayList<A> {
public B() {
    super();
}

public void addItem(A a) 
{
    this.add(a);
}

public void print() {
    this.print();
    }
}

このようなもの。

ただし、クラスの名前はランダムに生成され、ファイルを作成すると次のようなエラーが発生します。

symbol:   class A
location: class B  

./src/A.java:4: error: cannot find symbol

(4行目は「...extends ArrayList...」で、Aの下に^記号があります)

私のコード ジェネレーターは次のようにコンパイルされます。

最初に、A 型クラスのテンプレートでバッファーを埋めてから、次のようにコンパイルします。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, f.getPath());

その後、別のバッファーを作成し、B 型クラスのテンプレートを入力してから、次のようにコンパイルします。

System.out.println(f.getParentFile().getPath());
compiler.run(null, null, null, f.getPath());

fは;

f = new File(("./src/" + name + ".java"));

どうすればこの問題を解決できますか?

4

2 に答える 2

1

コメントで述べたように、コンパイラは、クラスがコンパイルさAれるときにクラスについて知る必要があります。B以下の例では、コンパイルされたクラスの出力ディレクトリを/tmp/bin/のコンパイラのクラスパスに追加しますoptionList

ソースファイルが必要ない場合は、ファイルシステムにソースファイルを作成しないようにすることができます

public class CompileDependent {

    public static void main(String[] args) {
        String sourceClassA = "public class A {"
                + "  public String toString() {"
                + "    return \"A\";"
                + "  }"
                + "}";
        String sourceClassB = "import java.util.ArrayList;"
                + "class B extends ArrayList<A> {"
                + "  public void addItem(A a) {"
                + "    this.add(a);"
                + "  }"
                + "}";

        List<JavaFileObject> compilationUnits = new ArrayList<>();
        compilationUnits.add(new StringJavaFileObject("A.java", sourceClassA));
        compilationUnits.add(new StringJavaFileObject("B.java", sourceClassB));

        List<String> optionList = new ArrayList<>();
        // classpath from current JVM + binary output directory
        optionList.add("-classpath");
        optionList.add(System.getProperty("java.class.path") + ":/tmp/bin");
        // class output directory
        optionList.add("-d");
        optionList.add("/tmp/bin");

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(
                null,
                Locale.UK,
                Charset.forName("UTF-8")
        );

        boolean compiled = compiler.getTask(
                null,
                fileManager,
                null,
                optionList,
                null,
                compilationUnits).call();
        System.out.println("compiled = " + compiled);
    }

    private static class StringJavaFileObject extends SimpleJavaFileObject {

        final String code;

        StringJavaFileObject(String name, String code) {
            super(URI.create("string:///" + name), Kind.SOURCE);
            this.code = code;
        }

        @Override
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
            return code;
        }
    }
}

または、ファイル システムに Java ソース ファイルを作成します。上記と同様のコードで、compilationUnits. ファイルは指定された場所に既に保存されていると想定されます。

List<File> sourceFiles = new ArrayList<>();
sourceFiles.add(new File("/tmp/A.java"));
sourceFiles.add(new File("/tmp/B.java"));
于 2016-01-28T14:12:54.913 に答える
0

これは助けになるはずです

    public void CompileClasses(ArrayList<String> classesNames){
    //File helloWorldJava = new File("classes\\"+className+".java");
    try {
        List<String> optionList = new ArrayList<String>();
        optionList.add("-classpath");
        optionList.add(System.getProperty("java.class.path") + ";dist/InlineCompiler.jar");
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
        Iterable<? extends JavaFileObject> compilationUnit=null;
        ArrayList<File> files = new ArrayList<>();
        for (String className:classesNames) {
        files.add(new File(className+".java"));
        }
        compilationUnit = fileManager.getJavaFileObjectsFromFiles(files);
        JavaCompiler.CompilationTask task = compiler.getTask(
                null,
                fileManager,
                diagnostics,
                optionList,
                null,
                compilationUnit);
        if (task.call()) {
            URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./").toURI().toURL()});
        } else {
            for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()) {
                System.out.format("Error on line %d in %s%n %s",
                        diagnostic.getLineNumber(),
                        diagnostic.getSource().toUri(),
                        diagnostic.toString());
            }
        }
        fileManager.close();
    } catch (IOException exp) {
        exp.printStackTrace();
    }

}
于 2019-01-25T12:53:56.567 に答える