단일 종속성의 모든 전이 종속성을 제외


221

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입니다.

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


때때로 Spring 2.5.6과 같은 최신 버전의 라이브러리를 사용해야하지만 다른 일부 종속성은 예를 들어 struts2-spring-plugin (2.1.6)에 Spring 2.5.3이 포함되어 있습니다. 이러한 시나리오에서는 버전을 제외하거나 재정의해야합니다.
Vinod Singh

1
아이비를 사용하십시오. 농담이야
Jake Toronto

답변:


54

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

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


12
배제를 피하기 위해 자신의 치어 리딩을하지 않는 것이 좋습니다. 이것은 당신의 빌드를 훨씬 덜 이식하고 이해력을 줄입니다.
Brian Fox


@JakubBochenski 내가 제공 한 답변은 maven 2에만 해당됩니다.이 질문에 태그가 붙은 것입니다 (이 의견을 쓸 당시). 귀하의 링크는 maven 3에만 관련됩니다. 그럼에도 불구하고, 나는 더 높은지지를받는 ​​답변에 링크되도록 링크를 편집했습니다.
whaley

306

나를 위해 일한 것은 (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의 와일드 카드는 일반적으로이 종속성을 사용하여 모듈에 전파되는 모든 종속성을 제외합니다.


9
그룹 artifiact에 대한 * 와일드 카드 받는다는 3에서 작동하는 것 같군
nkr1pt

22
Maven 3에서 별표 사용에 대해 명시 적으로 경고 한 것처럼이 작업을 어떻게 찾을 수 있었는지 모르겠습니다. [경고] 값이 "*"인 <artifcat_id>의 'dependencies.dependency.exclusions.exclusion.groupId'가 유효한 ID 패턴과 일치해야합니다. [경고] 이러한 문제는 빌드의 안정성을 위협하므로 문제를 해결하는 것이 좋습니다. [경고] 이런 이유로, 미래의 Maven 버전은 더 이상 이러한 기형의 프로젝트 작성을 지원하지 않을 수 있습니다. 지원되고 사용 가능하다는 증거를 제공 하시겠습니까? 그렇지 않으면 귀하의 의견을 매우 오도하는 것으로 간주합니다.
ᄂ ᄀ

7
Maven 3.0.4와 아름답게 작업했습니다. 감사합니다 많이 !
Evgeny Goldin

1
maven 3.0.4-> 그것은 나를 위해 잘 작동하지 않았습니다. 결과 항아리는 별표를 사용하거나 모든 직접 종속성을 명시 적으로 제외 할 때 매우 다릅니다. 그것은 뚱뚱한 항아리를 만들기 위해 maven-assembly-plugin을 사용하고 있다는 사실과 관련이있을 수 있습니다. 이 경우 제안 된 sulotion이 작동하지 않습니다!
gilad hoch

31
이 방법은 유효합니다. 그들은 다른 사람들이 maven 3.2.1에서보고한다는 경고를 수정했습니다 : issues.apache.org/jira/browse/MNG-3832
Ryan

32

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

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


23

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를 기반으로 작동 합니다. 자세한 내용은 설명서 를 참조하십시오.


적어도 Maven 3.1에서는 <configuration>명령 줄에서 목표를 실행할 때이 명령이 무시되고 바로 아래로 이동해야합니다 <plugin>.
David Harkness

방금 불쾌한 Maven 버그-버전 3.5.2처럼 보이는 것을 발견했습니다. 부모 <dependencyManagement>섹션 에서 종속성을 제외시키는 하위 모듈이있는 프로젝트가 있습니다. mvn dependency:tree해당 특정 프로젝트에서를 실행 하면 제외 된 종속성이 전혀 없습니다. 그러나 그 의존성을 가져 오는 모든 프로젝트 <exclusions>는 다른 프로젝트 부모 pom의 명예를 존중하지 않습니다 -제외 된 프로젝트는 들어갑니다! <exclusions>각 모듈 폼으로 직접 이동 해야했습니다.
cbaldan

11

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

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


6

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

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


1
이렇게하면 2 단계 전이 포함을 처리 할 수없는 Android Dalvik 컴파일러 관련 문제를 해결하는 데 도움이되었지만 <scope>provided</scope>대신 대신 사용해야 했습니다 <scope>runtime</scope>.
Garret Wilson

6

어셈블리에 포함 할 종속성 아티팩트에서 모든 전이 종속성을 제외해야하는 경우 어셈블리 플러그인의 설명자에서이를 지정할 수 있습니다.

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

3

Eclipse에서 개발하는 경우 POM 편집기 (고급 탭 사용) 종속성 그래프에서 프로젝트에서 제외하려는 종속성을 찾은 후 다음을 수행 할 수 있습니다.

마우스 오른쪽 버튼으로 클릭-> "Maven 아티팩트 제외 ..."를 선택하면 Eclipse가 lib가 연결된 종속성을 찾을 필요없이 제외됩니다.


m2eclipse 플러그인을 사용하는 경우에만 작동합니다.
Nicolas Mommaerts

2

전이 의존성을 모두 배제한 이유는 무엇입니까?

모든 종속성에서 제외해야하는 특정 아티팩트 (예 : 공통 로깅)가있는 경우 버전 99 존재하지 않음 접근법이 도움이 될 수 있습니다.


2012 업데이트 : 이 방법을 사용하지 마십시오. maven-enforcer-plugin 및 exclusions를 사용하십시오 . 버전 99는 가짜 종속성을 생성하고 버전 99 저장소는 오프라인입니다 ( 유사한 미러가 있지만 영원히 온라인 상태를 유지할 수는 없습니다. Maven Central 만 사용하는 것이 가장 좋습니다).


1

간단한 문제에서 범위를 제공하여 원하는 종속성을 선언했습니다. 이 접근 방식을 사용하면 전이 종속성이 페치되지만 패키지 단계에 포함되지 않으므로 원하는 단계입니다. 또한 유지 관리 측면에서이 솔루션이 마음에 듭니다. whaley 솔루션과 같이 유지 관리에 필요한 pom 또는 커스텀 pom이 없기 때문입니다. 컨테이너에 특정 종속성을 제공하기 만하면됩니다.


-2

클래스 패스에서 최신 메이븐을 사용하십시오. 중복 아티팩트를 제거하고 최신 메이븐 아티팩트를 유지합니다.

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