【问题标题】:Java Compiler API (Linux): cannot find symbol for custom classesJava Compiler API (Linux):找不到自定义类的符号
【发布时间】: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


【解决方案1】:

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

查看@Slaw 的评论,了解独立于平台的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多