2013-07-31 3 views
1

나는 maven-jetty-plugin을 사용하여 Jetty 9.0.4v20130625를 실행 중입니다. 나는 자신의 LoginService 클래스를 구현하여 사용자가 영역에 로그인하는 것을 처리합니다. 줄 중 하나에서 org.eclipse.jetty.util.security.Credential 클래스를 사용하려고 시도하지만 실행 중에 해당 줄에 NoClassDefFoundError이 발생합니다.Maven Jetty Plugin이 표준 부티크 병에서 클래스를 찾지 못하는 이유

target 디렉토리에는 Jetty 인스턴스에 배포되는 모든 것이 포함되어 있습니다. 그 안에 WEB-INF/lib 폴더에는 jetty-util-9.0.4.v20130625.jar이 예상대로 포함되어 있지 않으므로 플러그인에 이미이 파일이 있어야하므로 충돌하는 jar 파일을 제외한다고 생각합니다. 부두가이 항아리를 찾지 못하게하는 원인은 무엇일까요?

이클립스를 사용하고 있으며 코드에 오류가 표시되지 않습니다. Maven 프로젝트로 설정하고 Maven이 의존성을 처리합니다. 나는 부두가 배치 될 때 부두에 의해 제공되어야하므로 부두 단지를 포장하지 않도록 설정했습니다. 여기 내 pom.xml 파일입니다 :

<project ...> 
    ... 
    <packaging>war</packaging> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-webapp</artifactId> 
     <version>9.0.4.v20130625</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.mongodb</groupId> 
     <artifactId>mongo-java-driver</artifactId> 
     <version>2.11.2</version> 
    </dependency> 

    </dependencies> 
    <build> 
    <finalName>...</finalName> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.1</version> 
     <configuration> 
      <source>1.7</source> 
      <target>1.7</target> 
     </configuration> 
     </plugin> 

     <plugin> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <version>9.0.4.v20130625</version> 
     <configuration> 
      <scanIntervalSeconds>10</scanIntervalSeconds> 
      <webApp> 
      <contextPath>/...</contextPath> 
      </webApp> 
      <login-config> 
      <auth-method>FORM</auth-method> 
      <realm-name>Test Realm</realm-name> 
      <form-login-config> 
       <form-login-page>/loginAuth.html?param=redirect</form-login-page> 
       <form-error-page>/loginAuth.html?param=failed</form-error-page> 
      </form-login-config> 
      </login-config> 
     </configuration> 
     </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-scm-plugin</artifactId> 
     <version>1.8.1</version> 
     <configuration> 
      <connectionType>developerConnection</connectionType> 
     </configuration> 
     </plugin> 

     <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <phase>install</phase> 
      <configuration> 
       <tasks> 
       <ant target="deploy" /> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      </execution> 
     </executions> 
     <dependencies> 
      <dependency> 
      <groupId>com.jcraft</groupId> 
      <artifactId>jsch</artifactId> 
      <version>0.1.50</version> 
      </dependency> 
      <dependency> 
      <groupId>org.apache.ant</groupId> 
      <artifactId>ant-jsch</artifactId> 
      <version>1.9.2</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
나는 플러그인이 부두-util.jar에 따라 확실하게 확인

과 문제의 일부가 될 수 here

뭔가 바와 같이 수행합니다 구현하는 방법을 새로운 LoginService 인터페이스 클래스인데, 이미 LoginService을 구현하고있는 MappedLoginService 클래스를 확장하려고합니다. (이것은 Jetty jars에 있습니다.) 메소드 중 일부를 재정의하고 있습니다. 그것이 문제의 원인이 될 수 있습니까?

답변

1

Jetty는 거의 모든 구현 클래스를 webapp의 클래스 로더에서 숨 깁니다. webapp 내부에서 액세스해야하는 경우 webapp의 WEB-INF/lib에 넣어야합니다 (사용자의 경우 jetty-util jar에 대한 종속성을 추가하십시오).

이 클래스 로딩 메커니즘은 여기에 설명되어 있습니다 : http://www.eclipse.org/jetty/documentation/current/jetty-classloading.html

BTW, 당신의 pom.xml에서 부두 - 받는다는 - 플러그인에 대한 구성은 web.xml의 일부 라인을 포함하는 것 (즉, 요소 ​​내부의 것). 나는 Maven이 이해하지 못하는 설정을 무시한다고 생각하지만, 아마도 당신이 생각하는대로 설정되지 않았을까? 또한 사용자 정의 LoginService 사용에 대한 설정이 표시되지 않습니다.

+0

답 해 주셔서 감사합니다 .1 월. 그럴 수도 있다고 생각했습니다. jetty-util.jar에 의존성 추가 제안 사항 - 제 lib 폴더 안에 jetty-util.jar을 넣으면 로더 제약 조건 위반이 발생합니다. 오류는 org.codehaus.plexus.classworlds.realm.ClassRealm 클래스 로더와 ... jetty.webapp.WebAppClassLoader가 ... jetty.util.security.Credential 유형에 대해 다른 오브젝트를 가지고 있다고합니다. 나는 Credential 클래스와 내가 다른 프로젝트에 속한 다른 부두 종속성을 수동으로 가져와야한다고 생각하니? 그 맞습니까? – bzuillsmith

+0

플러그인 구성 정보 : 당신 말이 맞습니다. 로그인 구성은 불필요합니다. 어딘가에 다른 예제에 포함 된 것을 보았지만 web.xml에는 login-config도 포함되어있어 잘 작동합니다. 또한 올바르게 구성되었다는 것을 알고 있기 때문에 여기에 사용자 정의 loginService에 대한 구성을 두는 것을 원하지 않았습니다. 클래스가 코드를 실행해야하지만 자격 증명에 실패하면 코드를 실행합니다. lib에 jetty-util.jar를 포함하면 LinkageError가 마지막 주석에 설명되어 있습니다. – bzuillsmith

+1

마치 전쟁 중에 사용자 정의 LoginService가있는 것처럼 들립니다. LoginService는 컨테이너의 아티팩트의 일부이기 때문에 나는 그것이 비행 할 것이라고 생각하지 않습니다. 커스텀 LoginService를위한 별도의 프로젝트를 작성한 다음, jar를 jetty-maven-plugin 의존성에 추가하는 것이 좋습니다. 모든 것이 컨테이너의 classpath에 있습니다. – Jan