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

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



답변

로부터 메이븐 문서 :

  • 엮다

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

  • 제공

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

요약 :

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

답변

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

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

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

여기 참조가 있습니다.


답변

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

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


답변

  • 엮다

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

  • 제공

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


답변

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

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


답변

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


답변

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

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