2017-11-18 269 views
0

如果与jetty一起使用,我正在开发一个独立过滤器来扩展我们的webapp(BaseX)。 目标是在响应发送时推送一些附加资源。 Web应用程序定义了必须推送哪些资源。standalone pushfilter:jetty.server.request not found

随着嵌入式码头,一切顺利。但是部署BaxeX ALS Servlet时到码头,开始jettx:运行分叉,我得到这个:

java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Request 
at org.basex.http2.BaseXJettyPushFilter.doFilter(BaseXJettyPushFilter.java:48) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) 
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) 

...

这是过滤器的pom.xml:

<?xml version="1.0"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.basex</groupId> 
    <artifactId>basex-jetty-push-filter</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>basex-jetty-push-filter</name> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <jetty.version>9.4.6.v20170531</jetty.version> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-annotations</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlet</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlets</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-server</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-alpn-server</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty.http2</groupId> 
     <artifactId>http2-common</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty.http2</groupId> 
     <artifactId>http2-server</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-webapp</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.7.0</version> 
      <configuration> 
      <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ --> 
      <source>1.8</source> 
      <target>1.8</target> 
      </configuration> 
     </plugin> 
     </plugins> 
    </pluginManagement> 
    </build> 
    </project> 
    ... 

和我加载它依赖这里:

<parent> 
    <groupId>org.basex</groupId> 
    <artifactId>basex-parent</artifactId> 
    <version>9.0-SNAPSHOT</version> 
    <relativePath>..</relativePath> 
    </parent> 

    <name>BaseX API</name> 

    <dependencies> 
    <dependency> 
     <groupId>org.basex</groupId> 
     <artifactId>basex</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.basex</groupId> 
     <artifactId>basex-jetty-push-filter</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </dependency> 
    <dependency> 
     <groupId>net.xqj</groupId> 
     <artifactId>basex-xqj</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.xmldb</groupId> 
     <artifactId>xmldb-api</artifactId> 
    </dependency> 
    ... 

为什么我不能从W中访问服务器类很明显ebapp! webapp不应该对周围的servlet容器有任何依赖关系,因为它可能会改变。

这就是为什么我实现了过滤器独立,但不知何故它仍然无法访问server.Request类。 Jetty的PushCacheFilter也使用jetty.request类,它应该是可能的!

这里的过滤器: https://github.com/BodoWissemann/basex-jetty-push-filter

我怎样才能解决这个问题?我坚持:(

THX很多

博德

回答

0

西蒙娜·博尔德回答我的问题:

“@BodoWissemann你有它正确的Servlet容器类必须隐藏部署的Web应用程序,这就是为什么当您将Web应用程序部署到Jetty时,而不是在您运行嵌入式应用程序时,您会收到NoClassDefFoundError错误代码

Jetty的PushCacheFilter工作原因因为我们在Web应用程序类加载器中有一个默认的系统类规则,请参阅https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java#L128

您应该对BaseXJettyPushFilter执行相同的操作:将其放入服务器类路径中,并在Web应用程序类加载器中为其定义系统类规则。 我建议您阅读有关创建自定义Jetty模块的文档以及如何定义遵循本文档和本示例的服务器类规则。

请注意,在Servlet 4中,您将不需要任何此类API,因为要使用的API PushBuilder已经在Servlet API中标准化了。“