[maven-2] 단일 종속성의 모든 전이 종속성을 제외

Maven2에서 단일 전이 의존성을 제외하려면 다음과 같이해야합니다.

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

이 접근법의 문제점은에 의해 기여되는 모든 전이 의존성에 대해이 작업을 수행해야한다는 것 sample-artifactB입니다.

와일드 카드를 사용하여 모든 전이 종속성을 하나씩 제외하는 방법이 있습니까?



답변

maven2의 경우 설명하는 것을 수행 할 수있는 방법이 없습니다. maven 3에는 있습니다. maven 3을 사용 하는 경우이 질문에 대한 다른 답변을 참조하십시오

maven 2의 경우 <exclusions>가있는 종속성에 대한 사용자 지정 pom을 만드는 것이 좋습니다. 해당 종속성을 사용해야하는 프로젝트의 경우 일반적인 아티팩트 대신 사용자 정의 pom에 대한 종속성을 설정하십시오. 이를 통해 단일 <exclusion>을 사용하여 모든 전이 종속성을 제외 할 수는 없지만 종속성을 한 번만 작성하면 모든 프로젝트에서 불필요하고 긴 제외 목록을 유지할 필요가 없습니다.


답변

나를 위해 일한 것은 (Maven의 최신 기능 일 수 있음) 제외 요소에서 와일드 카드를 수행하는 것입니다.

두 개의 WAR 패키지 모듈에서 참조되는 “앱”모듈이 포함 된 다중 모듈 프로젝트가 있습니다. WAR 패키지 모듈 중 하나는 실제로 도메인 클래스 만 필요합니다 (그리고 아직 앱 모듈에서 분리하지 않았습니다). 나는 이것이 효과가 있음을 발견했다.

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

groupId 및 artifactId의 와일드 카드는 일반적으로이 종속성을 사용하여 모듈에 전파되는 모든 종속성을 제외합니다.


답변

내가 찾은 한 가지는 유용합니다.

프로젝트의 부모 POM 또는 가져 오기 가능한 종속성 관리 POM의 dependencyManagement 섹션에서 제외와의 종속성을 설정하면 제외 (또는 버전)를 반복 할 필요가 없습니다.

예를 들어, 부모 POM에 다음이있는 경우 :

<dependencyManagement>
    <dependencies>
    ...
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

그런 다음 프로젝트의 모듈은 종속성을 다음과 같이 간단히 선언 할 수 있습니다.

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

부모 POM에서 버전과 제외를 모두 지정합니다. 나는 거의 모든 프로젝트에이 기술을 사용하며 많은 반복 작업을 제거합니다.


답변

3 년 전 버전 99를 사용하지 않는 것이 좋지만, 특히 버전 99가 오프라인 상태이므로 더 나은 방법을 찾아 냈습니다.

프로젝트의 상위 POM 에서 원하지 않는 종속성이 빌드에 들어간 경우 maven-enforcer-plugin 을 사용하여 빌드를 실패하십시오. 플러그인의 금지 된 종속성 규칙을 사용하여 수행 할 수 있습니다 .

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

그런 다음 원하지 않는 종속성에 대해 경고하면 상위 POM <dependencyManagement>섹션 에서 제외 하십시오.

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

이렇게하면 원하지 않는 종속성이 실수로 표시되지 않고 ( <exclusion>쉽게 잊어 버릴 수있는 것과 달리 provided) 컴파일 시간 동안 ( 범위 와 달리 ) 사용할 수 없으며 가짜 의존성이 없습니다 (버전 99와 달리). ‘ (버전 99와 달리) 사용자 정의 저장소없이 작동합니다. 이 방법은 이슈의 버전, 분류 자, 범위 또는 전체 그룹 ID를 기반으로 작동 합니다. 자세한 내용은 설명서 를 참조하십시오.


답변

다음과 같은 해결 방법을 사용합니다. 모든 적절한 종속성에서 아티팩트를 제외하는 대신 종속성을 최상위 레벨에서 “제공됨”으로 그립니다. 예를 들어, xml-apis “어떤 버전”을 제공하지 않으려면 :

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>


답변

현재 한 번에 둘 이상의 전이 종속성을 제외 할 수는 없지만 Maven JIRA 사이트에서 이에 대한 기능 요청이 있습니다.

https://issues.apache.org/jira/browse/MNG-2315


답변

이에 대한 해결 방법이 있습니다. 종속성 범위를 runtime으로 설정하면 전이 종속성이 제외됩니다. 이것은 런타임 종속성을 패키지하려면 추가 처리를 추가해야 함을 의미합니다.

패키징에 런타임 종속성을 포함 시키기 위해 특정 아티팩트에 maven-dependency-plugin의 복사 목표를 사용할 수 있습니다 .