Maven, mvn bağımlılığını çalıştırırken kardeş modülleri tanımıyor: ağaç


90

Çok modüllü bir Maven projesi kurmaya çalışıyorum ve modüller arası bağımlılıklar görünüşe göre doğru ayarlanmıyor.

Sahibim:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>

ana POM'da (ambalaj tipi bir pom'a sahip) ve ardından alt dizinlerde commons/ve storage/aynı adla JAR pomları tanımlayan alt dizinler .

Depolama, Commons'a bağlıdır.

Ana (ana) dizinde, çalıştırıyorum mvn dependency:treeve görüyorum:

[INFO] Building system
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT

Bağımlılık ağacını başarıyla işlediği için reaktör açıkça gördüğü halde "ortak" bağımlılık neden başarısız oluyor? Orada olduğu gibi bulmak için kesinlikle ağa gitmemeli ...

Depolama için pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>
  <parent>
    <artifactId>system</artifactId>
    <groupId>domain</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>domain</groupId>
  <artifactId>storage</artifactId>
  <name>storage</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- module dependencies -->
    <dependency>
      <groupId>domain</groupId>
      <artifactId>commons</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- other dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Herhangi bir öneriniz için teşekkürler!

(Düzenle)

Açıklığa kavuşturmak gerekirse, burada aradığım şey şudur: Her ikisinin de aynı ana POM'dan referans alınan modüller olduğu göz önüne alındığında, X'e bağlı olan Y modülünü oluşturmak için X modülünü kurmak istemiyorum. Bu, aynı kaynak ağacında iki şeyim varsa, derlemeye devam etmek için ara ürünler yüklemem gerekmemesi bana sezgisel bir anlam ifade ediyor. Umarım düşüncem burada biraz mantıklıdır ...


2
Ahhh, Kurgu mükemmel. Bunu neden ilk niyette yazmadın? Ayrıca belki başlığı değiştirmeyi düşünebilirsiniz :) Seçici olmak istemiyorum, bu sadece açıklık ve sınıflandırma adına. Bu, gelecekte benzer bir sorunu ararken tüm topluluğa yardımcı olacaktır (bu, bağımlılıkla ilgili asıl başlık ve içerikle çok net değildir: ağaç)
Pascal Thivent

1
Selam. Çözümü buldunuz mu? Bende de bu sorun var :(

1
Derleme başarısız mı yoksa sadece bağımlılık: ağaç hedefi mi? Don Willis'in cevabına bakın.
metamatt

OMG yani bir modülde başka bir modülün sembollerini bulamadığı için başarısız olursa, diğeri bağımlılık olarak eklenmeli ve JAR olarak kurulmalıdır? Anahtar bu ....
WesternGun

üzgün maven 3.6 bu sorunu henüz
çözmüyor

Yanıtlar:


21

Bence sorun şu ki, bir bağımlılık belirlediğinizde, Maven onu jar (veya her neyse) paketlenmiş ve en azından yerel bir depodan temin edilebilir olarak beklemektedir. Eminim mvn installönce ortak projenizi çalıştırırsanız her şey işe yarayacaktır.


4
Kaynak ağacındaki modülün hangi sürümünü kullanmasını istediğimi belirtmenin bir yolu var mı? Bu davanın otomatik olarak halledileceğini düşündüm. Tüm projeyi her yapmak istediğimde Maven'in build-install-build-install-build yapmasını istemiyorum / istemiyorum!
Steven Schlansker

38
Yüklemeyi çalıştırmanın sorunu düzelttiği konusunda haklısınız. Ancak, şimdi her değişiklik yaptığımda yüklemem gerekiyor, ki bu istediğim şey değil. Depolama projesinin, ortak projeden en son kodu almasını istiyorum.
Steven Schlansker

Aslında benzer konularla uğraşmak zorundayım ve ne yazık ki - şu ana kadar bir cevap bulamıyorum. Görünüşe göre Maven, bağımlılığın modülünüzle bağlantılı olduğunu umursamıyor ve hemen depoya gidiyor. Sorunuza favori yazacağım - bu yüzden belki bir guru cevap verecektir. Bunun yapılıp yapılamayacağını öğrenmekle ilgileniyorum
Bostone

@Steven Lütfen endişenizi başka bir soru olarak gönderin, bir yoruma cevap vermek kullanışlı değildir ve bu başka bir konudur.
Pascal Thivent

6
Ana soru buydu, basitçe açıklığa kavuşturuyordum. İlk soruda, amacımın aynı projede başka modüller oluşturmak için yerel depoda yerleşik ürünlerin bulunmasını gerektirmediğini açıkça belirtmedim mi?
Steven Schlansker

104

Bu maven posta listesi iş parçacığında tartışıldığı gibi , bağımlılık: ağaç hedefi kendi başına reaktörden ziyade depodaki şeyleri arar. Daha önce önerildiği gibi mvn kurarak veya reaktörü çağıran daha az zahmetli bir şey yaparak bu sorunu çözebilirsiniz.

mvn compile dependency:tree

Benim için çalışıyor.


2
Bu ucuz çözüm için teşekkürler. Ama bu bir hata mı? Bağımlılık bekliyorum: ağaç hedefi, herhangi bir hile olmadan reaktöre dayanır.
mcoolive

Aynı durumun küresel olarak yürütülen herhangi bir görev için olduğu, ancak yalnızca bazı alt projeleri etkilediği unutulmamalıdır.
tkruse

Ne yazık ki, compilegeçişli bağımlılıkların indirilmesini tetikler. Bağımlılık ağacını gerçekten indirmeden listelemenin bir yolu var mı (elbette POM'lar dışında)?
sschuberth

Diğer hedefler için de aynı sorunu yaşadım. Eklemek compile( validateyeterli değil) orada da yardımcı oldu: mvn compile animal-sniffer:checkvemvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa

Yapınıza bağlı olarak, bazı Modüllerin sonraki aşamalarda inşa edilen yapılara bağımlılıkları da olabilir. Benim durumumda (maven-assembly-eklentisini kullanan) bir ZIP dosyası oluşturuldu package, bu yüzden örn mvn package animal-sniffer:check.
msa

6

Bunun daha eski bir iş parçacığı olduğunun farkına varmak, ancak görünen o ki ya araç gelişti ya da bu ilk seferde gözden kaçmış olabilir.

Bir reaktör derlemesi yaparak kurulum yapmadan bağımlılıkları çözen bir yapı gerçekleştirmek mümkündür.

Yapınızı, projenizin modül yapısını açıklayan üst öğede başlatırsanız, modüller arasındaki bağımlılıklar, dahili Maven reaktörü aracılığıyla derleme sırasında çözülecektir.

Elbette bu mükemmel bir çözüm değil çünkü yapı içindeki tek bir modülün oluşumunu çözmüyor. Bu durumda Maven, reaktöründe bağımlılıklara sahip olmayacak ve bunu depoda çözmeye çalışacaktır. Dolayısıyla, bireysel yapılar için önce bağımlılıkları kurmanız gerekir.

İşte bu durumu açıklayan bazı referanslar .


1
Önce bağımlılıkları kurmadan ve tüm ana projeyi oluşturmadan tek bir modül oluşturmanın bir yolu var mı?
ÇIKTI - Anony-Mousse

1
Cevabı tamamlamak için - eğer eklenti doğrudan (fazlar olmadan) çalıştırılırsa, örneğin mvn dependency:tree, siz compilefazı çağırmadıkça kaynaklardan bağımlılıkları çözmez . Yani bu yerine çalışacak: mvn compile dependency:tree.
Stanislav Bashkyrtsev

3

benim için beni bu konuya yönlendiren de benzer bir sorundu ve çözüm, tüm modül bağımlılığını sağlamaktı.

 <packaging>pom</packaging>

ebeveyn vardı

pom

benim model depomda pom vardı - yani bulunacak kavanoz yoktu.


Bu benim için şu hatayı atıyor: POM okuma hatasını ayrıştırma. Nedeni: Tanınmayan etiket: 'paketleme'
hithwen

düzenleme: <packaging> pom </packaging> düzeltmeyi kastetmiştim. <packaging> kavanoz </packaging> değiştiriliyor
bsautner

4
Bu, soruda açıklanan sorunu çözer, ancak artık alt modüller dışa aktarılabilir arşivler (yani kavanozlar, savaşlar, kulaklar) üretmez.
sheldonh

sheldonh bu hatayı düzeltmek için bir çözüm bulup dışa aktarılabilir bir arşiv oluşturdunuz mu?
user3853134

3

Benim için çalışan tek şey: gradle'a geçiş :(

Sahibim

Parent
  +---dep1
  +---war1 (using dep1)

ve sadece war1'e cd yazıp mvn tomcat7: run-war'ı kullanabilirim. Her zaman önce tüm projeyi yüklemem gerekir, ancak war1 ebeveynine ve üst öğeye war1 ve dep1 (modüller olarak) atıfta bulunmasına rağmen tüm bağımlılıklar bilinmelidir.

Sorunun ne olduğunu anlamıyorum.


1
Bu yüzden çoklu modül projesi oluşturmam gerektiğinde gradle kullanıyorum. :(
Zhuo YING

2

Bunun gibi bir Maven modül yapısında:

- parent
  - child1
  - child2

Buna sahip olacaksınız parent pom:

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

Şimdi dayanıyorsa child1içinde child2sizin de aşağıdaki koyarak <dependencies>in child2:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

JAR'ın bulunamaması için bir hata alacaksınız child1. Bu bildirerek çözülebilir <dependencyManagement>dahil bloğu child1içinde pomiçin parent:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1şimdi bir compileveya packagevb. hedefi çalıştırdığınızda oluşturulacak parentve derlenmiş dosyalarını child2bulacaktır child1.


2

Kapalı Bonusing cevap dan Don Willis :

Yapınız, test kodunu reaktör alt modülleriniz arasında paylaşmak için test kavanozları oluşturuyorsa, kullanmanız gereken:

mvn test-compile dependency:tree

bu, dependency:treebu durumda tamamlanmasına izin verecektir .


-1

Modülün pom dosyasına konfigürasyonları ekleyerek, arızalı modülün pomda çözüldüğünden, doğru ebeveyni işaret ettiğinden emin olun.

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.