嵌入式Jetty 9 PWC6188错误

时间:2014-07-30 12:31:36

标签: java eclipse jsp maven jetty

和其他许多人一样,我正面临PWC6188错误说

  

无法在web.xml或使用此应用程序部署的jar文件中解析“http://java.sun.com/jsp/jstl/core”。   这是一个相当普遍的问题,但是,我没有找到合适的解决方案。

首先,一些背景。我们刚迁移到Maven。从胖的Tomcat Web服务器切换到嵌入式Jetty 9 Web服务器。

以下,我已经阅读了这篇非常有用的文档:https://stackoverflow.com/tags/jstl/info 关于本文档,以下内容可能有用......

JSP - Taglib参考:

  

。<。%@ taglib prefix =“c”uri =“http://java.sun.com/jsp/jstl/core”%。>。

web.xml标题

<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="YourWebAppID"
    version="2.5">

总之,我至少需要JSTL 1.1和一个支持2.5 Servlet规范的servletcontainer。 因此,带有JSTL 1.2的Jetty 9可能适合。 &lt; - 真的吗?

此外,我想谈谈构建和部署webapp。 关于这篇文章:

  

cannot load JSTL taglib within embedded Jetty server

我可能有一些依赖性问题。在这里,您可以看到Web应用程序的pom.xml中定义的所有依赖项:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <!-- Parent container, which contains embedded Jetty 9 also uses log4j and provides the lib. -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
        <scope>provided</scope>
    </dependency>
    <!-- Some project related libs... -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-core</artifactId>
        <version>${struts.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts-taglib</artifactId>
        <version>${struts.version}</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <!-- Some more proprietary libs... -->
    <!-- ... -->

    <!-- Now it's getting interesting... -->
    <!-- Following dependencies are necessary to run 'mvn package'. 
        Scope is set to provided, so it's not transferred to resulting *.war. 
        Thus, containerserver must provide those.
    -->
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>${jetty.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

运行'mvn jetty:run'工作正常。它打包war文件,包含以下库:

ls target/ROOT/WEB-INF/lib
    antlr-2.7.2.jar
    commons-beanutils-1.8.0.jar
    commons-chain-1.2.jar
    commons-digester-1.8.jar
    commons-fileupload-1.3.1.jar
    commons-io-2.2.jar
    commons-logging-1.0.4.jar
    commons-validator-1.3.1.jar
    oro-2.0.8.jar

对我来说,这看起来很好。所有与网络应用程序相关的库都包含在战争中。 因此,此战争可能无法在Tomcat Web服务器中正常运行,因此Web应用程序不提供JSTL标记库。但是,我将使用嵌入式Jetty 9 ...这里是我的服务器容器中pom.xml中定义的所有依赖项:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${lib.log4j.version}</version>
    </dependency>
    <!-- Some more proprietary libs... -->
    <!-- ... -->

    <!-- Project-related libs. -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.10.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-email</artifactId>
        <version>1.3.3</version>
    </dependency>

    <!-- Jetty Web-Server -->
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>${jetty.version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jsp</artifactId>
        <version>${jetty.version}</version>
    </dependency>
</dependencies>

由于一些包含的库的许可,我需要提供所有的罐子。意思是,我可能不会提取并包含我生成的jar类。因此,我的maven程序集创建了以下结构:

*prefix*
    /bin
    myexecute.sh (calls java -jar ${prefix}/lib/java/main_app.jar)
    /lib/java
    *.jar (all the jar files)

前缀 / lib / java列出了以下库:

ls
    activation-1.1.jar
    commons-email-1.3.3.jar
    derby-10.10.2.0.jar
    main_app.jar
    javax.el-3.0.0.jar
    javax.servlet-api-3.1.0.jar
    javax.servlet.jsp-2.3.2.jar
    javax.servlet.jsp-api-2.3.1.jar
    javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
    javax.servlet.jsp.jstl-1.2.2.jar
    jetty-http-9.2.2.v20140723.jar
    jetty-io-9.2.2.v20140723.jar
    jetty-jsp-9.2.2.v20140723.jar
    jetty-schemas-3.1.M0.jar
    jetty-security-9.2.2.v20140723.jar
    jetty-server-9.2.2.v20140723.jar
    jetty-servlet-9.2.2.v20140723.jar
    jetty-util-9.2.2.v20140723.jar
    jetty-webapp-9.2.2.v20140723.jar
    jetty-xml-9.2.2.v20140723.jar
    log4j-1.2.17.jar
    mail-1.4.7.jar
    org.eclipse.jdt.core-3.8.2.v20130121.jar

main_app.jar中的类路径看起来很好。列出了所有必需的java库,应用程序运行正常。但是,由于PWC6188,我无法访问网络应用程序。 请注意,使用eclipse运行应用程序时没有PWC6188错误。我使用'mvn eclipse:eclipse'btw设置了项目。 关于这个帖子

  

Jetty 9 The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved

只需要jetty-webapp和jetty-jsp工件,用JSP,JSTL,Servlet等支持设置Jetty containerserver。

我还做了什么?我读了一些有关Jetty类加载的有用信息。

  

http://www.eclipse.org/jetty/documentation/current/jetty-classloading.html   它指出,WEB-INF文件夹中定义的库的优先级高于其容器服务器中的库。但是,即使我切换优先级,我也面临着PWC6188。如上所述

     

cannot load JSTL taglib within embedded Jetty server

它可能是设置类加载器的解决方案 - 我尝试过但没有成功。

总而言之,正如您可能已经注意到的那样,我尝试了很多并深入研究了所有这些JSTL库。但是,我无法摆脱PWC6188错误。我打赌这是微不足道的,然而,它也可能是Jetty 9的一个主要问题。 因此,我想感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

  

如果您在嵌入式方案中使用jetty,则需要使用   JSTL,那么你必须确保JSTL罐子包含在   容器的类路径 - 这是父类的路径   webapp的类路径。这是一个由此产生的限制   Java EE规范。

所以,你可以像这样解决你的问题:

WebAppContext webapp = new WebAppContext();
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader subClassLoader = new URLClassLoader(new URL[]{}, currentClassLoader);//this is the point.
webapp.setClassLoader(subClassLoader); //this is the point.
webapp.setContextPath("/");
webapp.setResourceBase("src/main/webapp");
server.setHandler(webapp);
server.start();
server.join();