메이븐 스코프 컴파일과 JAR 패키징에 대한 차이점


260

maven 범위 compileprovided이슈가 JAR로 빌드되는 시점 의 차이점은 무엇입니까 ? WAR 인 경우 아티팩트가 WEB-INF / lib에 포함되거나 포함되지 않을 것입니다. 그러나 JAR의 경우 중요하지 않습니다-종속성은 포함되지 않습니다. 범위가 compile또는 일 때 클래스 경로에 있어야합니다 provided. 나는 provided의존성이 전 이적이지 않다는 것을 알고 있습니다.

답변:


289

로부터 메이븐 문서 :

  • 엮다

    지정되지 않은 경우 사용되는 기본 범위입니다. 컴파일 종속성은 프로젝트의 모든 클래스 경로에서 사용할 수 있습니다. 또한 이러한 종속성은 종속 프로젝트로 전파됩니다.

  • 제공

    이것은 컴파일과 비슷하지만 JDK 또는 컨테이너가 런타임에 종속성을 제공 할 것으로 예상 함을 나타냅니다. 예를 들어, Java Enterprise Edition 용 웹 애플리케이션을 빌드 할 때 웹 컨테이너가 해당 클래스를 제공하므로 서블릿 API 및 관련 Java EE API에 대한 종속성을 제공 범위로 설정합니다. 이 범위는 컴파일 및 테스트 클래스 경로에서만 사용할 수 있으며 전이되지 않습니다.

요약 :

  • 의존성은 전 이적이지 않습니다 (앞서 언급했듯이)
  • 제공된 범위는 컴파일 및 테스트 클래스 경로에서만 사용할 수 있지만 컴파일 범위는 모든 클래스 경로에서 사용할 수 있습니다.
  • 제공된 종속성은 패키지화되지 않았습니다.

5
예, 알아요 그러나 나는 JAR packaging맥락 에서 범위의 차이에 대해 생각 합니다. Maven Doc은 그것에 대해 언급하지 않았습니다. 나는 잠시 동안 메이븐을 사용하지만, 나는 이미 그것에 대해 자신을 물어 단지했습니다 :)이 글은 것 같다 그래서 JAR packaging문맥의 차이가없는 compileprovided(종속 전환 제외). 내가 맞아?
emstol

3
@Jacob "컴파일 범위가 모든 클래스 경로 에서 사용 가능한 반면"은 무엇을 의미 합니까?
Geek

1
나는 "전이가 아님"이 가장 큰 문제라고 생각합니다. 의존성 지옥은 개발자가 매우 자주 직면하는 것이므로 제공된 범위로 인해 다른 버전을 사용하는 것이 중요합니다.
Seetharamani Tmr

2
차이점은 포장 단계에 있다고 생각합니다. 컴파일하면 최종 전쟁의 jar 또는 jar (예 : 스프링 부트 실행 가능한 jar)가 포함되며 제공되지 않을 수 있습니다. 제공된 jar은 웹 컨테이너 (예 : ext lib 폴더에 넣음)에 의해 제공 될 수 있으므로 다른 범위, 컴파일, 런타임에 종속되지 않는 경우 전쟁 패키지가 아닙니다.
Addo Zhang

1
@emstol 원래 질문으로 돌아가서 JAR의 경우 종속성이 JAR 자체 내에 패키지되어 있지 않은 것이 맞습니다. 그러나 maven에서 JAR 패키징은 라이브러리로 사용하기를 원한다는 의미입니다. 다른 maven 프로젝트에서 가져 오면 범위가 compile있고 범위가 아닌 경우 전이 종속성이 발생합니다 provided.
LeoLuz

291

컴파일은 앱을 컴파일하고 실행하기 위해 JAR이 필요하다는 것을 의미합니다. 예를 들어 웹 응용 프로그램의 경우 JAR은 WEB-INF / lib 디렉토리에 배치됩니다.

제공은 컴파일을 위해 JAR이 필요하다는 것을 의미하지만 런타임에 환경에서 제공하는 JAR이 이미 있으므로 앱과 함께 패키지화하지 않아도됩니다. 웹 앱의 경우 JAR 파일이 WEB-INF / lib 디렉토리에 배치되지 않습니다.

웹 앱의 경우 앱 서버가 이미 JAR (또는 해당 기능)을 제공하는 경우 "제공됨"을 사용하고 그렇지 않으면 "컴파일"을 사용하십시오.

여기 참조가 있습니다.


11
OP의 질문에 대답하지 않습니까? " 무엇 이슈가 될 때 제공 받는다는 범위 컴파일 및 사용에 그 차이 가 JAR 같은 사례를 ? '저자는 전쟁으로 포장 할 때 차이점을 알고 있다고 명시합니다.
Alberto

동일한 응용 프로그램 서버에 배포 된 다른 JAR을 참조하는 경우 제공을 사용할 수 있습니까 ??
Samy Omar

1
명확히하기 위해 제공된 종속성 mvn exec:java은 실행될 때 클래스 경로에 추가되지 않지만 컴파일 된 종속성은 추가됩니다.
Jamie

나는이 질문을했다 -stackoverflow.com/questions/37360132/… 범위는 제공된에서 컴파일로 변경하여 해결되었습니다. 그러나 "제공된"범위로 컴파일 된 jar와 "컴파일"범위로 컴파일 된 jar 사이에는 차이가 없습니다. 이유를 설명해 주시겠습니까?
Pavel_K


22

모든 종속 항목 (일반적인 xxxx-all.jar)으로 단일 JAR 파일을 생성하려는 경우이 범위 내의 클래스는 결과 JAR에 패키지되지 않으므로 범위가 중요합니다.

자세한 내용은 maven-assembly-plugin을 참조하십시오.


7
제공된 종속성 ==> 종속성이 패키지 되지 않습니다 .
Gab 是 好人

3
와 함께 패키징하면 OP 혼동이 명확하게 해결되며 maven-assembly-plugin, 가장 많이 투표 된 답변에 대해서는 언급하지 않을 것입니다.
Henrique G. Abreu 2016 년

이 답변을 이해하지 못합니다. 댓글처럼 보입니다.
reinierpost

11
  • 엮다

클래스 경로에 사용 가능하게 만들고, 일반 jar 인 경우 최종 jar에이 종속성을 추가하지 마십시오. 그러나 최종 항아리가 단일 항아리 (예 : 실행 가능한 항아리) 인 경우이 항아리를 항아리에 추가하십시오

  • 제공

종속성은 런타임 환경에서 사용 가능하므로 어떠한 경우에도이 종속성을 추가하지 마십시오. 단일 항아리 (예 : 실행 가능한 항아리 등)에도 없습니다


3

jar 파일의 경우, maven-jar-plugin 구성에서 addClassPath가 true로 설정되어 있으면 jar에 포함 된 MANIFEST.MF 파일에 나열된 클래스 경로에 차이가 있습니다. '컴파일'종속성은 매니페스트에 표시되며 '제공된'종속성은 표시되지 않습니다.

내 애완 동물 친구 중 하나는이 두 단어가 동일한 시제를 가져야한다는 것입니다. 컴파일 및 제공 또는 컴파일 및 제공


0

maven 범위를로 설정 provided하면 플러그인이 실행될 때 사용되는 실제 종속성 버전이 설치 한 Apache Maven 버전에 따라 달라집니다.


0

jar 파일이 실행 가능한 spring boot jar 파일과 같은 경우 모든 종속 파일의 범위 compile는 모든 jar 파일을 포함 해야 합니다.

그러나 jar 파일이 다른 패키지 또는 응용 프로그램에서 사용되는 경우 이러한 패키지 또는 응용 프로그램이 다른 종속성을 자체적으로 제공 할 수 있으므로 jar 파일에 모든 종속성을 포함 할 필요는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.