Maven 종속성을 전역 적으로 제외하는 방법이 있습니까?


93

나는 그것에 의존하는 모든 의존성에서 제외 할 필요없이 전 이적 의존성을 제외하는 "일반적인"방법을 찾으려고한다. 예를 들어 slf4j를 제외하려면 다음을 수행합니다.

  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
    <type>jar</type>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

이는 부분적으로는 pom 파일을 정리하기위한 것이며, 부분적으로는 제외 된 종속성에 의존하는 종속성을 추가하고이를 제외하는 것을 잊어 버린 사람들과 함께 향후 문제를 방지하기위한 것입니다.

방법이 있습니까?


2
문제를 해결하지는 못하지만 maven-enforcer-plugin에는 원하지 않는 종속성이 몰래 들어 오면 빌드에 실패 하는 금지 된 종속성 기능 이 있습니다. 그래도 수동으로 제외해야하지만 :-/
dnault

다른 답변은 여기에서 사용할 수 있습니다. stackoverflow.com/a/39979760/363573
Stephan

답변:


69

도움이 되나요? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"내 WAR에서 avalon-framework를 제외하고 싶다고 가정하면 제공된 범위를 사용하여 프로젝트 POM에 다음을 추가합니다. 이는 모든 전이 종속성에서 작동하며 한 번 지정할 수 있습니다.

<dependencies>
  <dependency>
      <artifactId>avalon-framework</artifactId>
      <groupId>avalon-framework</groupId>
      <version>4.1.3</version>
      <scope>provided</scope>
  </dependency>
</dependencies>

이는 상위 POM에서 지정하는 경우에도 작동하므로 프로젝트가 모든 하위 POM에서이를 선언하지 않아도됩니다. "


49
여전히 부분적인 해킹 일뿐입니다. 종속성은 빌드 아티팩트 내부에서 끝나지 않지만 테스트 중에 계속 사용할 수 있습니다.
Tuukka Mustonen

@TuukkaMustonen runtime범위 대신 provided범위는 어떻습니까?
Stephan

avalon-framework 4.1.3+가 프로젝트의 다른 곳에 포함되면 어떻게됩니까? 여기에서 응답을 참조하십시오. stackoverflow.com/a/39979760/363573
Stephan

나는 더 이상 Maven을 사용하지 않기 때문에 다른 답변을 테스트 할 위치에 있지는 않지만 @TuukkaMustonen
Joffer

18

빈 항아리를 만들고이 종속성을 만들었습니다.

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>system</scope>
    <systemPath>${basedir}/src/lib/empty.jar</systemPath>
    <version>0</version>
</dependency>

지금부터 컴파일 / 테스트 경로에 빈 항아리가 있기 때문에 완벽하지 않습니다. 그러나 그것은 단지 화장품입니다.


3
system범위는 이제 더 이상 사용되지 않습니다. maven.apache.org/guides/introduction/…
Jason Young

system범위를 사용하지 않으려면 가상 Maven 저장소 version99.grons.nl (경고 : HTTP 전용) 또는 (commons-logging / log4j 전용) "대안 3) 빈 아티팩트"를 참조하십시오. slf4j.org/faq.html#exceptJCL
seanf

16

dnault의 의견 을 확장하려면 :

하나는 사용할 수 메이븐 Enforcer의 플러그인의 금지 종속성이 지배 종속 제외하고 있는지 확인할 수도 있습니다. 여전히 수동으로 제외해야하지만 실수로 다른 곳에 종속성을 추가하면 빌드가 실패합니다.

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <bannedDependencies>
              <excludes>
                <exclude>org.slf4j:slf4j-api</exclude>
              </excludes>
            </bannedDependencies>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

또한 공개 기능 요청이 있습니다. MNG-1977 글로벌 종속성 제외


2
귀하의 답변과 링크에서 토론을 읽은 후 로컬 및 서버에서 사용되는 maven 버전이 다르기 때문에 원치 않는 jar가 fat jar에 때때로 들어오고 있으므로 엄격하게 적용되지 않으면 패키징 논리가 매우 다른 버전의 종속성을 추가 할 수 있음을 깨달았습니다. 비슷한 문제를 해결하기 위해 <goal> repackage </ goal>에 대해 spring-boot-maven-plugin configuration / excludes / exclude를 사용했습니다.
aprodan

10

참고로 Maven 공식 문서의 답변은 다음과 같습니다.

제외가 POM 수준이 아닌 종속성 기준으로 이루어지는 이유

이는 주로 종속성 그래프가 예측 가능한지 확인하고 제외해서는 안되는 종속성을 상속 효과가 제외하지 않도록하기 위해 수행됩니다. 최후의 수단을 사용하고 제외를 적용해야하는 경우 원치 않는 전 이적 종속성을 가져 오는 종속성이 무엇인지 절대적으로 확신해야합니다.

빌드를보다 견고하게 만들고 싶다면 버전 범위를 사용할 수 있습니다. 이렇게하면 새로운 버전의 종속성이 프로젝트를 방해 할 수 없습니다.

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>[1.4.2,)</version>
   <scope>provided</scope>
</dependency>

모든 slf4j-api 버전> = 1.4.2는 구성된 클래스 경로 또는 컨테이너에서 런타임시 제공 (제공) 된 것으로 간주됩니다.

참고 문헌

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