Maven中嵌入式Jetty的JSP测试没有编译

时间:2014-04-30 17:51:06

标签: jsp maven jetty surefire

我正在运行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获取类路径?任何帮助都会有很大的帮助。

2 个答案:

答案 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)

这个解决方案可以避免这种情况。