Java 编译器 API (Linux):找不到自定义符号 类

Java Compiler API (Linux): cannot find symbol for custom classes

我对 Java 编译器 API 有一个相当具体的问题。 对于我的用例,我必须在我的 Web 应用程序中的 运行 时间生成、编译和加载 java-class(使用 Tomcat)。

为了做到这一点,我在我的磁盘上创建了一个 .java-File,使用编译器 API 编译它,然后通过自定义 class 加载它装载机。所有这些在 windows 上工作得很好,但是一旦我在 Ubuntu-系统上尝试 运行 将它安装在应该安装的系统上,编译器找不到任何自定义 classes 在 class 中引用。 (两个系统都使用java8和相同版本的Tomcat。)

文件已正确创建并存储在网络应用程序的子目录中。 ('catalina.home/webapps/projectname/resources/') 我的应用程序的所有 .class 文件都存储在 'catalina.home/webapps/projectname/WEB-INF/classes/' 中。 此目录稍后添加到编译器的 class 路径:

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();

class路径的分配值确实指向目录,.class-文件所在的目录。但出于某种原因,我不断收到

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

对于每一个被引用的 class...(我没有忘记导入东西,包声明正确并且没有语法错误或拼写错误的名称。我仔细检查了一下,因为我提到,如果应用程序在 windows 上 运行ning,它工作正常)。 我什至试图将 src-File 保存在 /WEB-INF/classes/ 中,引用的 classes 所在的位置并在那里编译它,但这也没有帮助。

我不知道为什么编译器找不到这些 classes 以及 linux 有什么不同。它可能与文件权限或配置 Tomcat 的方式有关(例如,如果它是 运行 作为 root 而不是用户)?

尝试使用冒号而不是分号作为类路径分隔符。在 windows 上,分号是正确的,但在 *nix 上,分号实际上结束了 shell 命令,因此使用冒号代替。

请参阅@Slaw 的评论以获取独立于平台的方法。