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

나는 그것에 의존하는 모든 의존성에서 제외 할 필요없이 전 이적 의존성을 제외하는 “일반적인”방법을 찾으려고한다. 예를 들어 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 파일을 정리하기위한 것이며, 부분적으로는 제외 된 종속성에 의존하는 종속성을 추가하고이를 제외하는 것을 잊어 버린 사람들과 함께 향후 문제를 방지하기위한 것입니다.

방법이 있습니까?



답변

도움이 되나요? 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에서이를 선언하지 않아도됩니다. “


답변

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

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

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


답변

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 글로벌 종속성 제외


답변

참고로 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는 구성된 클래스 경로 또는 컨테이너에서 런타임시 제공 (제공) 된 것으로 간주됩니다.

참고 문헌


답변