developer tip

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

copycodes 2020. 10. 8. 08:08
반응형

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 공식 문서의 답변은 다음과 같습니다.

Why exclusions are made on a per-dependency basis, rather than at the POM level

This is mainly done to be sure the dependency graph is predictable, and to keep inheritance effects from excluding a dependency that should not be excluded. If you get to the method of last resort and have to put in an exclusion, you should be absolutely certain which of your dependencies is bringing in that unwanted transitive dependency.

If one wants to make a build more robust, a version range can be used. This would ensure that no newer version of the dependency can interfere with the project.

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

Any slf4j-api version >= 1.4.2 will be considered as offered (provided) at runtime, either from a configured classpath or a container.

References

참고URL : https://stackoverflow.com/questions/4716310/is-there-a-way-to-exclude-a-maven-dependency-globally

반응형