2017-11-18 264 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中標準化了。「