Использование JavaCompiler в пакете OSGi

Я нахожусь в процессе рефакторинга приложения 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 fileObjects = fileManager.getFileObjects(sourceFile);
CompilationTask task = compiler.getTask(null, fileManager, listener, Arrays.asList(options), null, fileObjects);
task.call();

Однако это не будет работать в пакете OSGi, так как путь к классам больше не содержит необходимых путей. В отредактированной версии приложения OSGi компилятору необходим доступ к классам, которые находятся в том же пакете, что и приведенный выше код, а также к классам из других пакетов. Как мне сообщить компилятору об этих классах?

Я подумал о двух возможных решениях:

  1. Дайте компилятору загрузчик классов, используемый пакетом, содержащим приведенный выше код, поскольку он знает обо всех необходимых классах. Однако это не кажется жизнеспособным решением из того, что я прочитал здесь и здесь .
  2. Создайте путь к классам, используя физические местоположения установленных пакетов. Я просмотрел org.osgi.framework.Bundle.getLocation () , но не уверен, что это будет надежным решением. Пути, которые я получаю (по крайней мере, при развертывании в Eclipse), являются относительными, и я не уверен, безопасно ли их использовать на всех платформах и в любых ситуациях.

Кажется ли возможным второй вариант? Есть ли лучшее решение?

6
задан Community 23 May 2017 в 11:52
поделиться