Maven bağımlılığını küresel olarak dışlamanın bir yolu var mı?


93

Geçişli bir bağımlılığı, ona bağlı olan tüm bağımlılıklardan dışlamak zorunda kalmadan dahil edilmekten dışlamanın "genel" bir yolunu bulmaya çalışıyorum. Örneğin, slf4j'yi hariç tutmak istersem, şunları yapıyorum:

  <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>

Bu kısmen pom dosyasını temizlemek, kısmen de gelecekte bu dışlanan bağımlılığa bağlı bağımlılıklar ekleyen kişilerle ilgili sorunları önlemek ve onu dışlamayı unutmak içindir.

Bir yolu var mı?


2
Sorunu çözmez, ancak maven-forcecer-plugin, istenmeyen bağımlılıklar gizlice
girerse derlemede

Alternatif bir yanıtı burada bulabilirsiniz: stackoverflow.com/a/39979760/363573
Stephan

Yanıtlar:


69

Bu yardımcı olur mu? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"Avalon-framework'ü WAR'ımdan hariç tutmak istediğimi varsayarsak, aşağıdakileri projelerime POM'u sağlanan kapsamı ile eklerim. Bu, tüm geçişli bağımlılıklarda çalışır ve bir kez belirtmenize izin verir.

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

Bu, ana POM'da belirtilirken bile işe yarıyor, bu da projelerin bunu tüm alt POM'larda bildirmek zorunda kalmasını engelliyor. "


49
Hala sadece kısmi bir hack - bağımlılık yapı yapısının içinde bitmeyecek, ancak testler sırasında hala kullanılabilir.
Tuukka Mustonen

@TuukkaMustonen runtimeKapsam yerine kapsam ne olacak provided?
Stephan

Avalon-framework 4.1.3+ projenin başka bir yerine dahil edilirse ne olur? Yanıtı burada görün: stackoverflow.com/a/39979760/363573
Stephan

Artık Maven kullanmıyorum, bu yüzden diğer cevapları test edecek konumda değilim, ancak @TuukkaMustonen
Joffer

18

Boş bir jar oluşturdum ve şu bağımlılığı yarattım:

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

Mükemmel değil çünkü şu andan itibaren derleme / test yolunuzda boş bir kavanoz var. Ama bu sadece kozmetik.


3
systemkapsam artık kullanımdan kaldırıldı: maven.apache.org/guides/introduction/…
Jason Young

systemKapsamı kullanmaktan kaçınmak için, sanal Maven deposu version99.grons.nl'ye bakın (Uyarı: yalnızca HTTP) veya (yalnızca commons-logging / log4j için) burada "alternatif 3) boş yapılar
seanf

16

DNA'nın yorumunu genişletmek için :

Bağımlılıkların dışlandığından emin olmak için Maven Enforcer eklentisinin Yasaklı Bağımlılıklar kuralı kullanılabilir. Bunları yine de manuel olarak dışlamak gerekir, ancak biri yanlışlıkla bağımlılığı başka bir yere eklerse yapı başarısız olur.

<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>

Ayrıca bir açık özellik isteği vardır: MNG-1977 Küresel bağımlılık istisnaları


2
Cevabınızı ve sağladığınız bağlantıdaki tartışmayı okuduktan sonra, istenmeyen kavanozların bazen sadece yerel ve sunucuda kullanılan maven sürümünün farklı olması nedeniyle şişman kavanozun içine girdiğini fark ettim, bu nedenle paketleme mantığı, sıkı bir şekilde uygulanmazlarsa oldukça farklı bağımlılık sürümleri ekleyebilir. Benzer problemimi çözmek için, <goal> yeniden paketleme </goal> için spring-boot-maven-plugin configuration / excludes / exclude kullandım.
aprodan

10

Bir hatırlatma olarak, işte Maven resmi belgelerinin cevabı:

Hariç tutmalar neden POM düzeyinde değil de bağımlılık temelinde yapılır

Bu, esas olarak bağımlılık grafiğinin öngörülebilir olduğundan emin olmak ve kalıtım etkilerinin dışlanmaması gereken bir bağımlılığı dışlamasını önlemek için yapılır. Son çare yöntemine ulaşırsanız ve bir dışlama koymanız gerekirse, bağımlılıklarınızdan hangilerinin bu istenmeyen geçişli bağımlılığı getirdiğinden kesinlikle emin olmalısınız.

Bir yapıyı daha sağlam yapmak isterse, bir sürüm aralığı kullanılabilir. Bu, bağımlılığın daha yeni bir sürümünün projeye müdahale etmemesini sağlayacaktır.

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

Herhangi bir slf4j-api sürümü> = 1.4.2, yapılandırılmış bir sınıf yolundan veya bir kapsayıcıdan çalışma zamanında sunulduğu (sağlandığı) kabul edilecektir.

Referanslar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.