Soru Neden Maven bağımlılıklarının sırası önemlidir?


Maven bağımlılıklarının sırasının daha önce önemi olmadığını düşündüm ve bunu bir profesyonel olarak kabul ettim. Ve bu benim eski pom.xmlbağımlılıkları:

<dependencies>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.1.7.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-spring3</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.19</version>
    </dependency>

</dependencies>

İyi çalışıyor ve bugün bahar bağımlılığını dibe doğru kaydırmak istiyorum. Ancak artık çalışamayacağım, Jetty'im şikayet ediyor:

[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run (default-cli) on project mtest: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run failed: A required class was missing while executing org.eclipse.jetty:jetty-maven-plugin:9.3.0.M1:run: org/apache/commons/logging/LogFactory

Bu gerçekten kafa karıştırıcı, bağımlılık siparişiyle ilgili kaygım var mı? Doğru siparişi nasıl öğrenebilirim?


25
2017-07-31 07:45


Menşei


Sorunuzu doğrudan yanıtlayamayabilir, ama normalde sadece ortak giriş-çıkış beyanı. Ekledikten sonra hala sorun olup olmadığını kontrol edin - Paul Samsotha
@peeskillet, buna ekledikten sonra, Jetty'im başarıyla başlatıldı ancak hizmetlerim çalıştırılamıyor. - Elderry


Cevaplar:


Bağımlılıkların sırası yapar Maven'in geçişli bağımlılıkları nasıl çözdüğünden dolayı, 2.0.9 sürümünden başlayarak. Alıntıdan belgeleme:

(...) bu, bir yapaylığın birden çok sürümü ile karşılaşıldığında bağımlılığın hangi sürümünün kullanılacağını belirler. (...) Her zaman projenizin POM'unda açıkça beyan ederek bir sürümü garanti edebilirsiniz. (...) Maven 2.0.9'dan beri, şu beyanda yer alan emrin sırası: ilk deklarasyon kazanır.


45
2017-07-31 10:09



Bu cevabın neden reddedildiğinden emin değilim. En azından kısmen - deklarasyonun düzeninin neden önemli olduğu sorusunu yanıtlar. - Kyle Krull
@KyleKrull kurbanıydım aşağılama misilleme. + 1'in için teşekkürler. - kryger


Diğer cevaba (bildirim sırasının Maven'in bağımlılık bağımlılığı için geçiş bağımlılığını etkilediğini bildiren) genişletmek için kullanabileceğiniz birkaç araç vardır:

  • mvn dependency:tree [-Dscope=[runtime|test]] Seçilen kapsam için hangi bağımlıların kullanılabileceğini size gösterecektir. Detaylar için buraya bakın
  • mvn dependency:build-classpath sınıf yolunuzda bağımlılıkların mevcut olduğu düzeni size verir (iki veya daha fazla sınıf yolu girdisi aynı sınıfa sahipse, önceki kazanırsa). Detaylar için buraya bakın

Durumunuz hakkında pek bir şey bilmiyorum, ancak genellikle derleme / çalışma zamanında 1 veya daha fazla kavanozun yanlış sürümüne sahip olmanız durumudur. Söz konusu kitaplığın kendi sürümünüzü bildirmek veya sürümü kilitlemek ile <dependencyManagement> burada seçenekler.

Şimdi diğer sorunuzu cevaplamak için - Bağımlılıkları bildirirken doğru düzenin ne olduğunu nasıl biliyorsunuz?

Benim önerim - Doğru beyanname, istediğin sırayla, istediğin bağımlılıkların versiyonlarını sağlayan şeydir.. Bağımlılıklarınızı kontrol etmek için yukarıdaki araçları kullanın ve gerekirse bildirilen siparişi düzeltin.

Çoğu kavanozun, eşlenik olmayan adlandırılmış sınıflar içerdiğini unutmayın, bu nedenle, sınıf yolunuzda kavanozların göründüğü kesin sıra genellikle bu kadar önemli değildir. Fark ettiğim tek istisna: SLF4J'de bazı kavanozlar diğer logger kitaplıklarının hangi sınıfları değiştirmeyi amaçladığı belli.


7
2017-12-14 16:04



Güzel cevaplar ve bağlantılar için teşekkürler - slugmandrew