我正在重构Java应用程序以使用OSGi。该应用程序的一个功能是使用javax.tools.JavaCompiler
进行动态Java编译。在原始应用程序中,此过程通过向编译器提供现有类路径来完成,就像这样。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
String[] options = {"-classpath", System.getProperty("java.class.path")};
DiagnosticListener<JavaFileObject> listener = new DiagnosticListener<JavaFileObject>() {...};
StandardJavaFileManager fileManager = compiler.getStandardFileManager(listener, null, null);
Iterable<? extends JavaFileObject> fileObjects = fileManager.getFileObjects(sourceFile);
CompilationTask task = compiler.getTask(null, fileManager, listener, Arrays.asList(options), null, fileObjects);
task.call();
但是,这在OSGi包中不起作用,因为类路径不再包含所需的路径。在重构的OSGi版本的应用程序中,编译器需要访问与上述代码在同一个包中的类,以及其他包中的类。如何让编译器知道这些类?
我想到了两种可能的解决方案:
答案 0 :(得分:3)
我在GitHub上创建了一个工作示例。
它不是选项1或2,它创建了一个自定义JavaFileManager,它可以查看所有包并检索它们的资源。
需要考虑的事项:
我应该提到Technology Excruciation,他的榜样帮助了我。