【问题标题】: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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 2014-02-09
        相关资源
        最近更新 更多