我正在运行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获取类路径?任何帮助都会有很大的帮助。
答案 0 :(得分:3)
我不完全确定为什么现在这样,但添加
-Dorg.apache.jasper.compiler.disablejsr199 =真
到maven命令行修复了问题
答案 1 :(得分:1)
另一种解决方法是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
将导致jetty不使用Java提供的编译器,而是使用内置版本。这个内置编译器使用different way to compute its classpath,似乎没有maven manifest-only-jar的问题。缺点是,这个内置编译器需要匹配您的Java版本。例如,在项目中使用旧版本的jetty(只有Java 7内部编译器)使用Java 8编译器会导致问题:
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)
这个解决方案可以避免这种情况。