在Windows上使用IntelliJ IDEA生成的动态类路径时,JSP编译失败

时间:2017-03-31 21:33:43

标签: java jsp tomcat intellij-idea javac

我有一个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。

我怎样才能使这个工作,或者我需要调查什么才能找到根本原因?

2 个答案:

答案 0 :(得分:1)

这是known bug in JDK

Javac错误地处理了清单类路径头中的绝对路径。它已在JDK9中修复。

答案 1 :(得分:0)

当我研究这个问题时,假设是Java8,我发现了一个不同的根本原因。

简而言之:

  • 第102行的“/org/apache/jasper/servlet/TldScanner.java”尝试扫描位置以寻找潜在的JAR。
  • 它使用“/org/apache/tomcat/util/scan/StandardJarScanner.java”进行实际搜索。
  • 在第221行URL[] urls = ((URLClassLoader) classLoader).getURLs();
  • 上设置断点
  • 您将看到此ClassLoader将“classpath.jar”作为要扫描的潜在JAR(即进程)。
  • 但是它无法进一步找到(classpath.jar)JAR的清单文件引用的JAR。意思是,不需要检查您需要的真实JAR。

一个简短的解决方案,其中一个是:

  • 将“standard-1.1.2.jar”添加到您的网站/ WEB-INF / lib / dir。
  • 如果查看这个jar,你会看到* .tld文件。

测试:

  • 您可以在TldScanner.java第311行found = true;上设置断点。
  • 当它不起作用时,你永远不会碰到这条线。
  • 当它工作时,使用此(或任何)修复,它将会触及此行。