2016-11-08 1 views
3

내 응용 프로그램에서 다음과 같은 J2EE 종속성을 포함하는 경우, 내가 서블릿과 JAX-RS 클래스와 인터페이스에 액세스 할 수 있습니다서블릿과 JAX-RS 의존성은 어디서 오는가?

<dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
    </dependency> 

하지만 그들은에서 오는을? Maven Central에서는 javax:javaee-api:7.0이 의존성이 javax:javaee-web-api:7.0이고, 차례로 종속성이 javax.servlet:javax.servlet-api:3.1.0javax.ws.rs:javax.ws.rs-api:2.0 인 것으로 나타났습니다. 이에 대한 답이 바로 그 것입니다.

그러나이 모든 종속성은 optional으로 표시됩니다. 이는 명시 적으로 포함하지 않는 한 전이 의존성으로서 내 프로젝트에 나타나지 않음을 의미합니다. 그러나 내 프로그램은 단지 javax:javaee-api:7.0에 종속되어 컴파일됩니다. 왜?

여기 내 의존성 트리입니다. 그들이오고있다 어디서 볼 수 없습니다 :

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ temp-server --- 
[INFO] com.example:test-server:war:1.0.0-SNAPSHOT 
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.1:provided 
[INFO] \- javax:javaee-api:jar:7.0:compile 
[INFO] \- com.sun.mail:javax.mail:jar:1.5.0:compile 
[INFO]  \- javax.activation:activation:jar:1.1:compile 

(이것은 모든 기본적인 것들입니다, 내가 혼란 스러워요 이유를 알고하지 않습니다 내가 뭔가를 분명 실종해야합니다.). JAX-RS 2.0

+0

특히 어떤 클래스에 대해 이야기하고 있습니까? –

답변

1

Java EE 7의 일부인 경우 해당 API를 정의하는 클래스는 이슈 javax:javaee-api:7.0에 직접 포함되므로 표준 클래스 만 사용하는 경우 프로그램을 컴파일하는 것으로 충분합니다.

+0

예를 들어, JAX-RS 클래스는'javax : javaee-api : 7.0'과'javax.ws.rs : javax.ws.rs-api : 2.0'에 중복됩니까? (그리고 그들은 누군가가 의존 관리를 가지고 있지 않은 경우를 대비해 이것을 수행했다고 생각한다.) –

+0

이미 언급했듯이 그것들은 단지'선택적인'의존성이다. 그래서 나는 그렇게 생각하지 않는다. 그러나 어쨌든'given'으로 정의되어야한다. 그래서 그것은별로 중요하지 않습니다. 나는'javax.ws.rs : javax.ws.rs-api : 2.0'은 순수한 JX-RS 앱을 사용하는 사람이나 컴파일 할 전체 API를 원하지 않는 사람들이 사용하기위한 것일 것이라고 생각합니다. –

+0

"duplicated" Java가 JAX-RS'.class' 파일을'javax : javaee-api : 7.0'과'javax.ws.rs : javax.ws.rs-api : 2.0'에 포함 시켰습니다. 후자는 의존성이다. 그건 내 질문에 대한 답변입니다. '.class' 파일이 JAR 파일에있을 것이라고 생각하지 않았습니다. 하나는 다른 하나의 의존성이기 때문입니다. 그 점을 지적 해 주셔서 감사합니다. –

1

여기서, <scope>provided</scope>의 의미를 이해해야합니다. 및 javax.ws.rs:javax.ws.rs-api:2.0javaee-api 종속성을 포함하면 provided과 같은 범위에 포함됩니다. 즉, 에만 클래스를 컴파일하는 동안 이러한 jar 파일이 사용되고 런타임에 사용됩니다. 범위는 provided이므로이 2 개의 병이 런타임 환경에서 제공 될 것으로 예상합니다. 다시 반복하기 위해 범위가 provided으로 포함 된 jar가 있으면이 jar을 컴파일에 사용해야 함을 의미하지만 런타임의 경우 런타임 컨테이너에서 제공해야합니다.

JBOSS,등과 같은 런타임 환경 컨테이너를 고려해 보면 질문에 대한 답변을 얻을 수 있습니다. 모두이 jar와 번들로 제공됩니다. 따라서 클래스를 컴파일 할 때 javaee-api에 전이 종속성이있는 항아리를 사용하지만 런타임에 컨테이너와 함께 번들로 제공된 항아리를 사용하게됩니다. 따라서 오류가 발생하지 않습니다.

+0

나는 ' 제공된'을 이해하지만 그 질문은 완전히 옆에 있습니다. 이 질문은 ''에 관한 것입니다. 그리고 그것은 컴파일 타임에 관한 것이었고 실행 시간이 아닌 의존성에 관한 것이 었습니다.질문을 다시 읽으십시오. 당신의 대답은 아주 좋았습니다. 다른 질문이었습니다. –

+0

@ Garret, 애플리케이션에있는 옵션 jar의 클래스를 사용하고 있습니까? –

+0

이것은 단지 내 컴파일러가'javax.ws.rs : javax.ws.rs-api : 2.0'에서 파일이 순조롭게 (그러나'optional'을 사용하여) 참조 된 것을 알아내는 질문이었습니다. : javaee-api : 7.0'. (Nicolas Filotto가 제공 한) 해답은 관련 클래스가'javax : javaee-api : 7.0'에 포함되어 있으므로 transit에 포함되지 않았기 때문입니다. JAX-RS 클래스가 다른 하나를 참조 했음에도 불구하고 JAX-RS 클래스가 두 개의 jar 파일에 포함될 수 있다는 것을 고려하지 않은 좋은 모듈화에 너무 익숙합니다. 이야기의 끝. 질문에 답했다. –

관련 문제