Как я использую JDK6 ToolProvider и JavaCompiler с контекстом classloader?

В моем случае вариант 3 оказался простым. В моем файле CMake для набора инструментов я просто добавил:

set(CMAKE_C_COMPILER_WORKS ON)
set(CMAKE_CXX_COMPILER_WORKS ON)

И теперь CMake не тратит впустую время на опросы функций моего компилятора.

Это работает в моем конкретном случае (прошивка встроенных систем), но было бы неплохо, как заставить CMake и -fstack-protector-strong работать также и с не встроенными программами.

6
задан Phil 9 November 2008 в 07:10
поделиться

3 ответа

Если Вы знаете путь к классу в файлы, которые известны contextclassloader, можно передать их компилятору:

    StandardJavaFileManager fileManager = compiler.getStandardFileManager(this /* diagnosticlistener */, null, null);
// get compilationunits from somewhere, for instance via fileManager.getJavaFileObjectsFromFiles(List<file> files)
List<String> options = new ArrayList<String>();
options.add("-classpath");
StringBuilder sb = new StringBuilder();
URLClassLoader urlClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
for (URL url : urlClassLoader.getURLs())
    sb.append(url.getFile()).append(File.pathSeparator);
options.add(sb.toString());
CompilationTask task = compiler.getTask(null, fileManager, this /* diagnosticlistener */, options, null, compilationUnits);
task.call();

Этот пример предполагает использование URLClassloader (который позволяет Вам получать путь к классу), но Вы могли вставить свой собственный путь к классу, если бы Вы хотели.

8
ответ дан 10 December 2019 в 02:55
поделиться

Другая опция состоит в том, чтобы использовать палату общин JCI.

1
ответ дан 10 December 2019 в 02:55
поделиться

Здесь вы задаете два разных вопроса.

Один из них - как скомпилировать классы, которых нет в системном пути к классам. Это легко решить, передав аргумент командной строки "-classpath" компилятору (как впервые упомянул Лейка).

Второй - как создать экземпляры ToolProvider и JavaCompiler в загрузчике классов контекста потока. На момент написания этой статьи это нерешенный вопрос: Использование javax.tools.ToolProvider из пользовательского загрузчика классов?

0
ответ дан 10 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: