【问题标题】:standalone pushfilter: jetty.server.request not found独立推送过滤器:未找到 jetty.server.request
【发布时间】:2018-05-02 01:34:22
【问题描述】:

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

使用嵌入式码头,一切顺利。但是当将 BaxeX als servlet 部署到码头并从 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>
    ...

很清楚为什么我不能从 webapp 中访问服务器类! webapp 不应该对周围的 servlet-container 有任何依赖,因为它可能会改变..

这就是我独立实现过滤器的原因,但不知何故它仍然无法访问 server.Request 类。 Jetty的PushCacheFilter也用到了jetty.request-class,应该可以吧!

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

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

非常感谢!

博多

【问题讨论】:

    标签: jetty servlet-filters jetty-9 server-push


    【解决方案1】:

    Simone Bordet 回答了我的问题:

    “@BodoWissemann 您说得对,必须对已部署的 Web 应用程序隐藏 Servlet Container 类,这就是为什么当您将 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 中标准化。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2015-01-08
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多