2017-11-18 21 views
0

jetty와 함께 사용되는 경우 웹 응용 프로그램 (BaseX)을 확장하기 위해 독립형 필터를 작업하고 있습니다. 목표는 응답이 전송 될 때 몇 가지 추가 자원을 밀어 넣는 것입니다. webapp는 어떤 리소스를 푸시해야하는지 정의합니다.독립 실행 형 푸시 필터 : jetty.server.request 찾을 수 없음

임베디드 부두에서는 모든 것이 잘됩니다. 부두에 BaxeX 루게릭 병 서블릿을 배포하고 jettx로 시작하는 때 : 갈래 실행할,이 얻을 :

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

:

이 필터의 pom.xml 파일입니다

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) 

... 여기에 의존성으로로드하고 있습니다 :

<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은 주위 서블릿 컨테이너에 의존해서는 안되기 때문에 변경 될 수 있습니다.

그렇기 때문에 필자는 독립형 필터를 구현했지만 어떻게 든 여전히 server.Request 클래스에 액세스 할 수 없습니다. Jetty의 PushCacheFilter도 jetty.request 클래스를 사용합니다. 가능해야합니다! 이

가 어떻게이 문제를 해결할 수 https://github.com/BodoWissemann/basex-jetty-push-filter : 여기

필터입니까? 나는 붙어 :(

들으 많은

보도

답변

0

시몬 보르는 내 질문에 대답!

"당신은 서블릿 컨테이너 클래스에 숨겨져해야 그것을 잘 것을 가지고 @BodoWissemann을 따라서 웹 응용 프로그램을 Jetty에 배포 할 때 NoClassDefFoundError를 가져오고 임베디드를 실행할 때는 NoClassDefFoundError를 얻지 못합니다.

Jetty의 PushCacheFilter가 작동합니다. 우리는 웹 응용 프로그램 클래스 로더의 기본 시스템 클래스 규칙을 가지고 있습니다 (https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java#L128 참조).

BaseXJettyPushFilter에 대해 동일한 작업을 수행해야합니다. 서버 클래스 경로에 배치하고 웹 응용 프로그램 클래스 로더에서 시스템 클래스 규칙을 정의합니다. 사용자 정의 Jetty 모듈 작성에 대한 문서와이 문서 및이 예제에 따라 서버 클래스 규칙을 정의하는 방법을 읽는 것이 좋습니다.

서블릿 4에서는 사용할 API가 서블릿 API에서 표준화되어 있기 때문에이 중 아무 것도 필요하지 않습니다. "