【问题标题】:JSPs for embedded Jetty in Maven tests not compilingMaven 测试中嵌入式 Jetty 的 JSP 未编译
【发布时间】:2014-04-30 17:51:06
【问题描述】:
我正在运行一个嵌入式版本的 Jetty (7.6.14v20131031),它是自动化单元测试的一部分,其中包括访问 JSP。当我在 Eclipse 中运行单元测试时,它运行良好,但是当我从 maven 命令行运行时,在编译 JSP 时出现类未找到错误:
org.apache.jasper.JasperException: PWC6033: Javac 编译错误
用于 JSP
PWC6199:生成的 servlet 错误:包 javax.servlet 不存在
PWC6199:生成的 servlet 错误:包 javax.servlet.http 没有
存在
PWC6199:生成的 servlet 错误:包 javax.servlet.jsp 没有
存在
。 . .
它也找不到任何特定于该项目的类。好像JSP 编译器没有从surefire 获取类路径?任何帮助将不胜感激。
【问题讨论】:
标签:
jsp
maven
jetty
surefire
【解决方案1】:
我不完全确定为什么现在可以使用,但是添加了
-Dorg.apache.jasper.compiler.disablejsr199=true
到maven命令行修复问题
【解决方案2】:
另一种解决方法是disable the maven manifest-only-jar。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<useManifestOnlyJar>false</useManifestOnlyJar>
</configuration>
</plugin>
....
<plugin>
传递classpath in maven tests 的默认方式似乎混淆了JSP 编译器。
其他答案中使用的
disablejsr199 将导致码头不使用 Java 提供的编译器,而是使用内置版本。这个内置编译器使用 different way to compute its classpath 并且似乎没有与 maven manifest-only-jar 的问题。缺点是,这个内置编译器需要匹配你的 Java 版本。例如,在项目中使用 Java 8 编译器和旧版本的 jetty(只有 Java 7 内部编译器)会导致问题:
Jan 12, 2017 8:31:36 AM org.apache.jasper.compiler.JDTJavaCompiler$1 findType
SCHWERWIEGEND: Compilation error
org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
at org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:372)
at org.apache.jasper.compiler.JDTJavaCompiler$1.findType(JDTJavaCompiler.java:358)
at org.apache.jasper.compiler.JDTJavaCompiler$1.findType(JDTJavaCompiler.java:315)
at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:113)
at org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.resolve(UnresolvedReferenceBinding.java:49)
at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.resolveType(BinaryTypeBinding.java:122)
at org.eclipse.jdt.internal.compiler.lookup.PackageBinding.getTypeOrPackage(PackageBinding.java:168)
at org.eclipse.jdt.internal.compiler.lookup.Scope.getType(Scope.java:2469)
at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1006)
at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1258)
at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:539)
at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:763)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:468)
at org.apache.jasper.compiler.JDTJavaCompiler.compile(JDTJavaCompiler.java:494)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:384)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
这个解决方案可以避免这种情况。