Kapsamlı "içe aktarmalı" ve "içe aktarmasız" "pom" türü bağımlılığı arasındaki fark nedir?


112

Maven 2.0.9'dan başlayarak dahil etme olasılığı vardır

<type>pom</type>
<scope>import</scope>

içinde <dependencyManagement>bölüm.

Anladığım kadarıyla, sanki orjinal olarak burada tanımlanmışlar gibi bu pomda bulunan bağımlılıklar ile "değiştirilecek".

Yukarıdaki çözüm ile kapsamsız bu pom'a basit bağımlılık arasındaki fark nedir import(ikincisinin "bağımlılıklar gruplaması" olarak adlandırıldığını gördüm)? Bağımlılıkların önceliğini çözerken bu tür "gruplanmış" bağımlılıkların daha düşük önceliğe sahip olması tek fark mıdır?

Yanıtlar:


187

Yalnızca yönetilen bağımlılıkları içe aktarabilirsiniz . Bu, yalnızca diğer POM'ları projenizin POM'unun bölümüne aktarabileceğiniz anlamına gelir dependencyManagement. yani

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

Daha sonra olan şey, dependencyManagementbölümünde tanımlanan tüm bağımlılıkların other-pom-artifact-idPOM'nuzun dependencyManagementbölümünde yer almasıdır . Daha sonra dependency, POM'unuzun (ve tüm alt POM'larının) bölümünde, versionvb. Eklemek zorunda kalmadan bu bağımlılıklara başvurabilirsiniz .

Senin POM sadece normal bir bağımlılık tanımlamak Ancak eğer other-pom-artifact-idsonra tüm dependenciesgelen dependencybölümünde other-pom-artifact-idprojenizde geçişli dahildir - ancak tanımlanan bağımlılıklar dependencyManagementbölümünde other-pom-artifact-idhiç yer almaz.

Dolayısıyla, temel olarak iki farklı türdeki bağımlılığı (yönetilen bağımlılıklar ve normal bağımlılıklar) içe aktarmak / dahil etmek için iki farklı mekanizma kullanılır.

Maven web sitesinde bunu benim yapabildiğimden çok daha iyi açıklayabilen iyi bir sayfa var, Maven'deki Bağımlılık Yönetimi ve ayrıca bağımlılıkların içe aktarılmasıyla ilgili özel bilgiler de içeriyor .


1
Eğer pomA'da üstüdür pomEğer kapsamı ile proje A'nın bağımlılık yönetiminde B yerleştirebilir, B import?
Janez Kuhar

nasıl çalıştığını açıklamak için harika bir cevap, ama neden ?? neden diğer bağımlılıkları geçişli olarak dahil etmek istemiyorsunuz? ayrıca ikisini de yapabilir misin? other-pom-artifact-id içe aktarılsın ve sonra diğer-pom-artifact-id'nin de bağımlılık olarak ilan edilsin mi?
Junchen Liu

DZone ile ilgili bir makale farklı bir şey ifade ediyor: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>KURU ve Sıska Savaş
coz

1
@JunchenLiu: Diyelim ki A projesinin sadece birkaç özelliğini kullandığınızı varsayalım, böylece sadece o özellik için gerekli olan geçişli bağımlılıkları dahil etmeyi seçebilirsiniz. Bunu <dependency> içinde <exclude> kullanarak da çözebilirsiniz. Örneğin şunu kontrol edin: jdbi.org/#_getting_started
Nitiraj

15

Başka bir pomprojede olduğu gibi bir tip projeniz olamaz simple dependency. (Yapabilirsin - ama yararlı hiçbir şey yapmayacak). Sadece bir parent-childilişki olabilir. Bu aslında managing dependency through inheritance.

importbölümdeki pomtür bağımlılığı kapsamı <dependencyManagement>eşdeğerini elde etmenizi sağlar multiple inheritance.

Farklı poms- her biri birbiriyle managingilişkili bağımlılıklar olabilir. Bu olabilir kullanmak projeler importbunlar pomsdaha sonra onlar sürümü hakkında endişe gerek kalmadan gereken bağımlılıkları belirtin. Bu, özünde bill of materials@ DB5 tarafından belirtilen bağlantılarda gösterilen kavramdır.

Bu parent poms, karmaşık çok modüllü projelerin çok büyük ve hantal hale gelmesini önlemeye yardımcı olur .


8
Emin misiniz? Diğer projelerde (paketleme savaşı) düzenli bir bağımlılık olarak (kendi bağımlılıkları olan) normal pom'u koydum ve hedef projenin WEB-INF / lib'ine dahil edilen pom projesinden tüm bağımlılıkları aldım. Bu soruyu
sormamın

2
Teşekkürler @Raghuram, soruyu cevaplarken ebeveyn POM seçeneğini belirtmeyi tamamen unuttum. Basit bir bağımlılık olarak pom tipi bir projeye gelince bu mümkündür. Orijinal soruda belirtildiği gibi, bağımlılıkları gruplamak
DB5


5

Nesne yönelimli programlama paradigmasına çok benzeyen iki kavram, sorunun yanıtlanmasına yardımcı olacaktır:

  1. DependencyManagement bölüm yalnızca geçerli proje bağımlılıkları ve ayrıntılarını beyan - amaç ya miras yoluyla (diğer projelerde detayları ve yeniden kullanım yönetimidir ebeveyn ) veya ithalat ( kapsam ). Bu, programda bir veri türü bildirmek ve onu kullanıma hazır hale getirmek gibidir.

  2. Bağımlılık bölümü isteğe altında beyan bağımlılıkları ayrıntıları (yani, sürüm, vs.) devralır, projede bağımlılıkları fiili kullanımını tanımlar dependencyManagment . Bu nedenle, bağımlılıkları yalnızca bağımlılık yönetimine koyarsanız eksik bağımlılıklarınız olacaktır . Bu, ihtiyaç duyulan bir programda bir veri türünün değişken bir örneğinin somutlaştırılmasına benzer.


Bu iyi ve net ama yukarıdakinden farklı bir soruyu yanıtlıyor. :-)
Rick-777
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.