【发布时间】:2019-02-23 12:26:49
【问题描述】:
Java 编译器 API 有一个相当具体的问题。 对于我的用例,我必须在运行时在我的 Web 应用程序(使用 Tomcat)中生成、编译和加载一个 java 类。
为此,我在磁盘上创建了一个 .java 文件,使用 Compiler API 对其进行编译,然后通过自定义类加载器加载它。所有这些在 Windows 上都可以正常工作,但是一旦我尝试在应该安装它的 Ubuntu 系统上运行它,编译器就找不到该类中引用的任何自定义类。 (两个系统都使用 java 8 和相同版本的 Tomcat。)
该文件已正确创建并存储在 Web 应用程序的子目录中。 ('catalina.home/webapps/projectname/resources/') 我的应用程序的所有 .class 文件都存储在“catalina.home/webapps/projectname/WEB-INF/classes/”中。 此目录稍后会添加到编译器的类路径中:
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-Files 所在的目录。但由于某种原因,我不断得到
cannot find symbol
symbol: class *nameOfReferencedClass*
location: class testfiles.TestFile
对于每个引用的类...(我没有忘记导入内容,包被正确声明并且没有语法错误或拼写错误的名称。我仔细检查过,正如我所提到的,如果应用程序在 Windows 上运行)。 我什至尝试将 src-File 保存在 /WEB-INF/classes/ 中,引用的类驻留并在那里编译它,但这也无济于事。
我不知道为什么编译器找不到这些类以及 linux 可能有什么不同。是否与文件权限或 Tomcat 的配置方式有关(例如,如果它以 root 而不是用户身份运行)?
【问题讨论】:
-
尝试使用冒号而不是分号作为类路径分隔符。在 windows 上,分号是正确的,但在 *nix 上,分号实际上结束了一个 shell 命令,所以用冒号代替。
-
如果@schtever 对问题的看法正确,您可以使用
File.pathSeparatorChar(或File.pathSeparator)。 -
啊,谢谢你们!这为我解决了问题:) 不敢相信我在这个愚蠢的错误上浪费了多少时间......
标签: java linux tomcat compiler-errors java-compiler-api