Java Compiler API (Linux): не удается найти символ для пользовательских классов - PullRequest
0 голосов
/ 23 февраля 2019

У меня довольно специфическая проблема с API компилятора Java.Для моего варианта использования я должен сгенерировать, скомпилировать и загрузить java-класс во время выполнения в моем веб-приложении (используя Tomcat).

Для этого я создаю .java-файл на своем диске,скомпилируйте его, используя API компилятора, а затем загрузите его через пользовательский загрузчик классов.Все это прекрасно работает в Windows, но как только я попробую запустить его в системе Ubuntu, на которой он должен быть установлен, компилятор не сможет найти никаких пользовательских классов, на которые есть ссылки в классе.(Обе системы используют Java 8 и одну и ту же версию Tomcat.)

Файл создан правильно и хранится в подкаталоге веб-приложения.('catalina.home / webapps / projectname / resources /'). Все .class-файлы моего приложения хранятся в 'catalina.home / webapps / projectname / WEB-INF / classes /'.Этот каталог позже добавляется в classpath компилятора:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
File classesFolder = new File(TestFile.class.getProtectionDomain().getCodeSource().getLocation().getFile());        
List<String> optionList = new ArrayList<String>();
//Adding the classpath to the OptionList
optionList.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path") + ";" +  Settings.projectPath + "WEB-INF/classes/;" + classesFolder.getAbsolutePath() )); 
CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, files); //a task is initialized with the values previously specified and saved
task.call();

Назначенные значения для classpath указывают на каталог, в котором находятся .class-Files.Но по какой-то причине я продолжаю получать

cannot find symbol
symbol:   class *nameOfReferencedClass*
location: class testfiles.TestFile

для каждого отдельного класса, на который есть ссылки ... (Я не забыл импортировать вещи, пакеты были объявлены правильно, и в них нет синтаксических ошибок или имен с ошибками.Я дважды проверил это, и, как я уже говорил, он работает нормально, если приложение работает на Windows).Я даже пытался сохранить файл src внутри / WEB-INF / classes /, где находятся ссылочные классы, и скомпилировать его там, но это тоже не помогло.

Понятия не имею,почему компилятор не может найти эти классы и что может отличаться для Linux.Может ли это быть связано с правами доступа к файлу или с тем, как настроен Tomcat (например, если он запускается от имени пользователя root вместо пользователя)?

1 Ответ

0 голосов
/ 23 февраля 2019

Попробуйте использовать двоеточие вместо точки с запятой в качестве разделителя пути к классам.В Windows правильная точка с запятой, но в * nix точка с запятой фактически завершает команду оболочки, поэтому вместо нее используется двоеточие.

См. Комментарий @Slaw для независимого от платформы способа выполненияэто.

...