2014-04-30 86 views
2

我跑碼頭的嵌入式版本(7.6.14v20131031),其是一個自動化單元的測試,包括訪問的JSP的一部分。當我運行單元測試在Eclipse中它完美的作品,但是當我從maven的命令行中運行,我得到找不到類的錯誤,同時編譯JSP:JSP的嵌入式碼頭Maven中測試未編譯

org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP

PWC6199: Generated servlet error: package javax.servlet does not exist

PWC6199: Generated servlet error: package javax.servlet.http does not exist

PWC6199: Generated servlet error: package javax.servlet.jsp does not exist

. . .

它也無法找到任何具體的類的這個項目。它彷彿JSP編譯器是沒有得到從萬無一失的類路徑?任何幫助將大大appreaciated。

回答

3

我不能完全肯定這是爲什麼現在的工作,但加入

-Dorg.apache.jasper.compiler.disablejsr199=true

到maven的命令行修復

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是在對方的回答中使用會導致碼頭不使用Java提供的編譯器,但使用內置的版本。這種內置的編譯器使用different way to compute its classpath,似乎沒有使用Maven清單隻-JAR的問題。缺點是,這個內置的編譯器需要匹配您的Java版本。例如使用與舊版本的碼頭的項目一個Java編譯器8(即只有一個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) 

這可以通過這一解決方案來避免。