Java 编译器 API (Linux) : cannot find symbol for custom classes

标签 java linux tomcat compiler-errors java-compiler-api

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

为了做到这一点,我在我的磁盘上创建了一个 .java 文件,使用编译器 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 命令,因此使用了冒号。

请参阅@Slaw 的评论以了解独立于平台的方式来执行此操作。

关于Java 编译器 API (Linux) : cannot find symbol for custom classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54841590/

相关文章:

Java RMI 教程 - AccessControlException : access denied (java. io.FilePermission

java - MongoCollection 与 DBCollection java

c - 为什么 mmap 在这里不起作用

java - 尝试启动 Spring Boot 应用程序时获取服务器时区值 'unknown' 错误

java - 慢速双缓冲方法

c++ - "dynamically linked at run time but statically aware"- 如何控制加载哪个.so文件?

c - hash_add 使系统崩溃

tomcat - 如果已部署,Jenkins 自动部署程序无法在 tomcat 中部署

java - 新部署给出嵌套异常是 java.lang.NoClassDefFoundError : org/postgresql/core/types/PGLong

java - 如何将新的java类添加到jar文件中的现有类