0

私はJDKとJRE 8を使用してIntelliJ Ideaで作業しています。プロジェクトはlombokを利用しており、コード生成とランタイムコンパイルが必要です。私の目的は、実行時に生成された複雑なラムダ関数と同じタスクを実行するコードを作成して、評価を高速化することです。このプロジェクトはロンボクを多用しています。ここで説明したのと同じ問題を抱えているので、この問題を回避する 1 つの方法は、特定の依存関係を追加することです。

私の質問は次のとおりです。たとえば、編集せずに、この問題を回避する他のよりクリーンな方法はありましたpom.xmlか? 私はチームによって開発された大規模なプロジェクトに参加しており、そのような地上レベルで干渉したくありません。

より具体的には、私のコードは、次のような例で見られるランタイム コンパイルの通常のコードのように見えます

//Create class code
StringBuilder sb = new StringBuilder();
sb.append("package foo{\n");
sb.append("    public class bar{\n");
sb.append("        public Function<Object,Object> tee {return x -> x;}\n");
sb.append("    }\n");
sb.append("}");
String code = sb.toString();
//Creating a temporary file
File flie = File.createTempFile("bar", ".java");
Writer writer = new Filewriter(file);
writer.write(code);
writer.flush();
writer.close();
//Creating compilation environment
DiagnosticCollector<JavaFileObject> diagnostics = 
    new DiagnosticCollector<JavaFileObject>();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
    compiler.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUtils =
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(file));
JavaCompiler.CompilationTask task = compiler.getTask(
    null, fileManager, diagnostics, null, null, compilationUtils);
//Compiling the file
boolean success = task.call();
//Trying to extract the classes
Class clazz = Class.forName("bar");

読みやすくするために、すべてtryの s とcatchs を省略しています。ここで、コードを実行すると、 operator で例外がスローされます Class clazz = Class.forName("bar);。一方、diagnostics変数には次のメッセージが表示されます。

C:\Users\Kolya\AppData\Local\Temp\bar4319793429862999020.java:6: warning: Can't initialize javac processor due to (most likely) a class loader problem: java.lang.NoClassDefFoundError: com/sun/tools/javac/processing/JavacProcessingEnvironment
class bar
^
    at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:83)
    at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:87)
    at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:140)
    at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:69)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:500)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:597)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:690)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    at com.sun.tools.javac.main.Main.compile(Main.java:523)
    at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
    at com.megasoft.superproj.hyperpackage.AwesomeCodeGen.generateAwesomeCode(AwesomeCodeGen.java:100500)
    ...

どんな提案にも感謝します。

4

0 に答える 0