Я нахожусь в процессе рефакторинга приложения Java для использования OSGi. Одной из функций приложения является компиляция Java на лету с использованием javax.tools.JavaCompiler
. В исходном приложении этот процесс работал, передавая компилятору существующий путь к классам, например.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
String[] options = {"-classpath", System.getProperty("java.class.path")};
DiagnosticListener listener = new DiagnosticListener() {...};
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 компилятору необходим доступ к классам, которые находятся в том же пакете, что и приведенный выше код, а также к классам из других пакетов. Как мне сообщить компилятору об этих классах?
Я подумал о двух возможных решениях:
org.osgi.framework.Bundle.getLocation ()
, но не уверен, что это будет надежным решением. Пути, которые я получаю (по крайней мере, при развертывании в Eclipse), являются относительными, и я не уверен, безопасно ли их использовать на всех платформах и в любых ситуациях. Кажется ли возможным второй вариант? Есть ли лучшее решение?