我有一个Spring / MVC / Tomcat网站项目,我试图使用IntelliJ IDEA运行。因为我在Windows上运行,所以存在命令行大小限制,大型类路径会超出该限制。我使用IntelliJ的动态类路径功能,它将类路径放在一个jar文件中以缩短命令行。 Java
与-classpath <classpath.jar>
一起运行。
当我尝试查看页面时,JSP编译失败并出现此错误:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: [-1] in the generated java file: [<removed>.java]
[javac] <removed>.java:11: error: package javax.servlet does not exist
[javac] import javax.servlet.*;
[javac] ^
我在调试中运行它并进入java编译的位置并找到使用的javac
命令行。它被放在org.apache.tools.ant.taskdefs.compilers.JavacExternal
中。我自己使用javac
运行-verbose
命令,并注意到来自search path for class files:
日志行的依赖路径显示如下:
C:\Users\<removed>\AppData\Local\Temp\file:\C:\Users\<removed>\lib\servlet-api-3.0.jar
请注意,绝对URI路径似乎被视为相对路径,从而导致路径无效。我相信这就是为什么它没有正确编译。
Intellij生成的路径jar MANIFEST.MF
列出了类路径,其条目是绝对路径,如下所示:
file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/charsets.jar file:/C:/Program%20Files/Java/jdk1.8.0_121/jre/lib/deploy.jar [...]
这个问题在Mac上没有发生,使用动态类路径jar(即使它没有必要,因为命令行太长时间没有错误发生)所以我相信Windows路径或方式IntelliJ在Windows上生成类路径jar正在弄乱JSP编译。
此外,使用生成具有相对路径的路径jar的Ant构建任务也可以,但我有兴趣避免在这里使用Ant。
我怎样才能使这个工作,或者我需要调查什么才能找到根本原因?
答案 0 :(得分:1)
Javac错误地处理了清单类路径头中的绝对路径。它已在JDK9中修复。
答案 1 :(得分:0)
当我研究这个问题时,假设是Java8,我发现了一个不同的根本原因。
URL[] urls = ((URLClassLoader) classLoader).getURLs();
found = true;
上设置断点。