maven 범위 compile
와 provided
이슈가 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 파일에 모든 종속성을 포함 할 필요는 없습니다.