Tek bir bağımlılığın tüm geçişli bağımlılıklarını hariç tutma


221

Maven2'de, tek bir geçiş bağımlılığını dışlamak için, böyle bir şey yapmalıyım:

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

Bu yaklaşımdaki sorun, bunu katkıda bulunan her geçişli bağımlılık için yapmak zorunda olduğum sample-artifactB.

Tüm geçiş bağımlılıklarını tek tek yerine bir kerede hariç tutmak için bir tür joker karakter kullanmanın bir yolu var mı?


Bazen kütüphanenin en son sürümünü kullanması gerekir. Bu tür senaryolarda, sürümün hariç tutulması veya geçersiz kılınması gerekir.
Vinod Singh

1
Ivy'yi kullan. Şaka yapıyorum.
Jake Toronto

Yanıtlar:


54

Maven2 için tarif ettiğiniz şeyi yapmanın bir yolu yoktur. Maven 3 için var. Maven 3 kullanıyorsanız lütfen bu soru için başka bir cevaba bakınız.

Maven 2 için <eklentileriniz> olan bağımlılık için kendi özel pom'unuzu oluşturmanızı tavsiye ederim. Bu bağımlılığı kullanması gereken projeler için, bağımlılığı tipik artefakt yerine özel pom'a ayarlayın. Bu, tüm geçiş bağımlılıklarını tek bir <hariç tutma> ile hariç tutmanıza izin vermese de, bağımlılığınızı yalnızca bir kez yazmanıza izin verir ve tüm projelerinizin gereksiz ve uzun hariç tutma listelerini tutması gerekmez.


12
İstisnalar etrafında çalışmak için kendi pom yapma karşı tavsiye ederim. Bu, yapınızı daha az taşınabilir hale getirir ve kavrayışı azaltır.
Brian Fox

1
Geçmişte kabul edilmiş anwser görmüyorsanız: jira.codehaus.org/browse/MNG-3832
Jakub Bochenski

@ JakubBochenski verdiğim cevap maven 2'ye özgüdür, bu da bu sorunun etiketlendiği şeydir (bu yorumu yazdığım sırada). Bağlantınız yalnızca maven 3 için geçerlidir. Her şeye rağmen cevabımı daha yüksek oranda oylanan cevaba bağlantı vermek için düzenledim.
whaley

306

Benim için işe yarayan (Maven'in daha yeni bir özelliği olabilir) sadece dışlama öğesinde joker karakterler yapıyor.

İki WAR paketlenmiş modüllerinde başvurulan bir "app" modülü içeren bir çoklu modül projesi var. Bu WAR paketli modüllerden biri gerçekten sadece etki alanı sınıflarına ihtiyaç duyuyor (ve henüz uygulama modülünden ayırmadım). Bunun işe yaradığını gördüm:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Hem groupId hem de artifactId üzerindeki joker karakter, normalde bu bağımlılığı kullanarak modüle yayılacak tüm bağımlılıkları hariç tutar.


9
* Grup ve artefakt için joker karakter, maven 3'te çalışıyor gibi görünüyor
nkr1pt

22
Maven 3 yıldız işareti kullanımı hakkında açıkça uyarıda bulunduğundan, bu çalışmayı nasıl bulabildiğinizi bilmiyorum: [UYARI] 'bağımlılık. geçerli bir kimlik modeliyle eşleşir. [UYARI] Bu sorunları düzeltmeniz önemle tavsiye edilir, çünkü bunlar yapınızın dengesini tehdit eder. [UYARI] Bu nedenle, gelecekteki Maven sürümleri artık bu tür hatalı biçimlendirilmiş projelerin oluşturulmasını desteklemeyebilir. Desteklendiğine ve kullanılabileceğine dair bazı kanıtlar sunabilir misiniz? Aksi takdirde yorumunuzu son derece yanıltıcı olarak değerlendiririm.
ᄀ ᄀ

7
Maven 3.0.4 ile güzel çalıştı. Teşekkürler çok !
Evgeny Goldin

1
maven 3.0.4 -> benim için iyi çalışmadı. asterix kullandığımda veya tüm doğrudan bağımlılıkları açıkça hariç tuttuğumda sonuçlanan kavanoz çok farklı. bir yağ kavanoz oluşturmak için maven-assembly-eklentisi kullanıyorum gerçeği ile ilgili olabilir. bu durumda, önerilen sulasyon işe yaramaz!
gilad hoch

31
Bu yöntem geçerlidir. Başkalarının maven 3.2.1'de bildirdiği uyarısını düzelttiler: issue.apache.org/jira/browse/MNG-3832
Ryan

32

Yararlı bulduğum bir şey:

İstisnalara bağımlılığı projeniz için üst POM'un veya ithal edilebilir bir bağımlılık yönetimi POM'sinin dependsencyManagement bölümüne koyarsanız, hariç tutmayı (veya sürümü) tekrarlamanız gerekmez.

Örneğin, üst POM'nuzda şunlar varsa:

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

Daha sonra projenizdeki modüller bağımlılığı basitçe şu şekilde açıklayabilir:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

Ana POM içindeki hem sürümü hem de hariç tutmaları belirtir. Bu tekniği neredeyse tüm projelerimiz için kullanıyorum ve çok fazla tekrarı ortadan kaldırıyor.


23

Üç yıl önce Sürüm 99 Var Değil'i kullanmanızı öneriyorum, ancak şimdi daha iyi bir yol buldum, özellikle Sürüm 99 çevrimdışı olduğundan:

Projenizin üst POM'sinde, istenmeyen bağımlılık derlemeye sızarsa derlemeyi başarısız kılmak için maven-enforcer-plugin kullanın. Bu, eklentinin yasaklanmış bağımlılıklar kuralı kullanılarak yapılabilir :

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

Ardından bu, istenmeyen bir bağımlılık konusunda sizi uyardığında, üst POM'un <dependencyManagement>bölümünde hariç tutun :

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

Bu şekilde istenmeyen bağımlılık yanlışlıkla görünmez (sadece <exclusion>unutulması kolay olanın aksine provided), derleme zamanı ( kapsamın aksine ) sırasında bile kullanılamaz , sahte bağımlılıklar yoktur (Sürüm 99'un aksine) ve ' özel bir depo olmadan çalışacaktır (Sürüm 99'un aksine). Bu yaklaşım, yapının sürümüne, sınıflandırıcılarına, kapsamına veya tüm bir gruba göre de çalışacaktır - ayrıntılar için belgelere bakın.


En azından Maven 3.1 altında <configuration>, hedefi komut satırından yürütürken göz ardı edildiğini ve doğrudan altına taşınması gerektiğini unutmayın <plugin>.
David Harkness

Kötü bir Maven böceğine benzeyen şeyi buldum - sürüm 3.5.2. Alt modüllerle bir projem var, burada ebeveynin <dependencyManagement>bölümünde bir bağımlılığı hariç tutuyorum . Bir Koşu mvn dependency:treebu özel projede hiç dışlanan bağımlılık olmaz. Ancak bu bağımlılığı ithal eden tüm projeler <exclusions>, diğer proje üst pom'dan onurlandırılmayacak - hariç tutulanlar sürünecek !!! Ben <exclusions>her modül pom doğrudan taşımak zorunda kaldı .
cbaldan

11

Aşağıdaki geçici çözümü kullanıyorum: Tüm uygun bağımlılıklarda yapay nesneyi dışlamak yerine, bağımlılığı en üst düzeyde "sağlanan" olarak çiziyorum. Örneğin, xml-apis "ne olursa olsun" gönderiminden kaçınmak için:

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


6

Bunun için bir geçici çözüm vardır, çalışma zamanına bağımlılığın kapsamını ayarlarsanız , geçişli bağımlılıklar hariç tutulur. Bununla birlikte, çalışma zamanı bağımlılığını paketlemek istiyorsanız bunun ek işleme eklemeniz gerektiği anlamına gelir.

Herhangi bir ambalaja çalışma zamanı bağımlılığını dahil etmek için, belirli bir eser için maven-bağımlılık-eklentisinin kopya hedefini kullanabilirsiniz .


1
Bu, Android Dalvik derleyicisiyle, iki düzey geçişli kapanımların bazılarını işleyemeyen sorunlar üzerinde çalışmama yardımcı oldu - ancak <scope>provided</scope>bunun yerine kullanmak zorunda kaldım <scope>runtime</scope>.
Garret Wilson

6

tüm geçişli bağımlılıkları bir derlemeye dahil edeceğiniz bir bağımlılık yapısından hariç tutmanız gerekirse, bunu derleme eklentisinin tanımlayıcısında belirtebilirsiniz:

<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 altında gelişirseniz, POM Editor (gelişmiş sekmeler etkin) bağımlılık grafiğinde projenizi hariç tutmak istediğiniz bağımlılığı arayabilir ve ardından:

sağ tıklayın -> "Maven Artefaktını Hariç Tut ..." ve Eclipse, lib'in hangi bağımlılığa bağlı olduğunu bulmanıza gerek kalmadan sizin için dışlamayı yapacak.


bunun sadece m2eclipse eklentisini kullanıyorsanız işe yaradığını unutmayın
Nicolas Mommaerts

2

Tüm geçişli bağımlılıkları dışlama nedeniniz nedir?

Her bağımlılıktan hariç tutmanız gereken belirli bir yapı (commons-logging gibi) varsa, Sürüm 99 Var Değil yaklaşımı yardımcı olabilir.


2012 Güncellemesi: Bu yaklaşımı kullanmayın. Maven-enforcer-eklentisi ve hariç tutmalar kullanın . Sürüm 99 sahte bağımlılıklar üretir ve Sürüm 99 deposu çevrimdışıdır ( benzer aynalar vardır, ancak sonsuza kadar çevrimiçi kalmaları için onlara güvenemezsiniz; sadece Maven Central'ı kullanmak en iyisidir).


1

Benzetimli bir konuda sağlanan kapsam ile istenen bağımlılık ilan vardı. Bu yaklaşımla geçişli bağımlılıklar getirilir, ancak paket aşamasına dahil DEĞİLDİR, bu da sizin istediğiniz şeydir. Bakım açısından da bu çözümü seviyorum, çünkü whaley'nin çözümünde olduğu gibi pom veya özel pom yoktur; sadece kapta belirli bir bağımlılık sağlamanız ve yapılması gerekenler


-2

Sınıf yolunuzdaki en son maven kullanın .. Yinelenen eserler kaldırır ve en son maven eserler tutar ..

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.