独立的pushfilter:找不到jetty.server.request



我正在开发一个独立的过滤器来扩展我们的webapp(BaseX),如果它与jetty一起使用的话。目标是,在发送响应时推送一些额外的资源。网络应用程序定义了哪些资源必须被推送。

有了嵌入式码头,一切顺利。但是,当将BaxeX-als-servlet部署到jetty并从jettx:run forked开始时,我得到的是:

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>
...

很清楚为什么我不能从网络应用程序中访问服务器类!Web应用程序不应该对周围的servlet容器有任何依赖关系,因为它可能会更改。。

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

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

我该如何解决这个问题?我被卡住了:(

太多了!

博多

Simone Bordet回答了我的问题:

"@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 PushBuilder已在Servlet API中标准化。">

最新更新