Maven tidak mengenali modul saudara saat menjalankan dependensi mvn: tree

90

Saya mencoba menyiapkan proyek Maven multi-modul, dan dependensi antar-modul tampaknya tidak disiapkan dengan benar.

Saya sudah:

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

di POM induk (yang memiliki pom tipe pengemasan) dan kemudian subdirektori commons/dan storage/yang mendefinisikan pom JAR dengan nama yang sama.

Penyimpanan bergantung pada Commons.

Di direktori utama (master), saya menjalankan mvn dependency:treedan melihat:

[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

Mengapa ketergantungan pada "commons" gagal, meskipun reaktor telah melihatnya dengan jelas karena berhasil memproses pohon ketergantungannya? Seharusnya tidak pergi ke 'net untuk menemukannya karena itu di sana ...

Pom untuk penyimpanan:

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

Terima kasih atas sarannya!

(Sunting)

Untuk memperjelas, yang saya cari di sini adalah: Saya tidak ingin menginstal modul X untuk membangun modul Y yang bergantung pada X, mengingat keduanya adalah modul yang direferensikan dari induk POM yang sama. Ini masuk akal bagi saya bahwa jika saya memiliki dua hal di pohon sumber yang sama, saya tidak perlu menginstal produk perantara untuk melanjutkan pembuatan. Semoga pemikiran saya masuk akal di sini ...

Steven Schlansker
sumber
2
Ahhh, Hasil editnya sempurna. Mengapa Anda tidak menulis ini pada niat pertama? Juga, mungkin pertimbangkan untuk mengubah judul :) Saya tidak bermaksud pilih-pilih, ini hanya demi kejelasan dan klasifikasi. Ini akan membantu seluruh komunitas di masa depan ketika mencari masalah serupa (yang tidak jelas dengan judul dan konten sebenarnya tentang ketergantungan: pohon)
Pascal Thivent
1
Hai. Apakah Anda sudah menemukan solusinya? Saya memiliki masalah ini juga :(
1
Apakah kompilasi gagal, atau hanya ketergantungan: tujuan pohon saja? Lihat jawaban Don Willis.
metamatt
OMG jadi dalam satu modul jika gagal karena tidak dapat menemukan simbol modul lain, yang lain harus ditambahkan sebagai ketergantungan dan diinstal sebagai JAR? Ini adalah kuncinya ....
WesternGun
Sayangnya

Jawaban:

21

Saya pikir masalahnya adalah ketika Anda menentukan ketergantungan Maven mengharapkan untuk memilikinya sebagai jar (atau apa pun) yang dikemas dan tersedia dari setidaknya repo lokal. Saya yakin jika Anda menjalankan mvn installproyek milik bersama terlebih dahulu, semuanya akan berhasil.

Bostone
sumber
4
Apakah ada cara untuk menentukan bahwa saya ingin menggunakan versi modul apa pun yang ada di pohon sumber? Saya kira kasus ini akan ditangani secara otomatis. Saya tidak ingin / tidak berpikir Maven harus membangun-install-build-install-build setiap kali saya hanya ingin membuat keseluruhan proyek!
Steven Schlansker
38
Anda benar bahwa menjalankan pemasangan akan memperbaikinya. Namun, sekarang saya harus menginstal setiap kali saya melakukan perubahan, yang bukan itu yang saya inginkan. Saya ingin proyek penyimpanan mengambil kode terbaru dari proyek milik bersama.
Steven Schlansker
Saya sebenarnya harus berurusan dengan masalah serupa dan sayangnya - saya tidak dapat menemukan jawaban sejauh ini. Sepertinya Maven tidak peduli bahwa dependensi ditautkan ke modul Anda, itu langsung masuk ke repo. Saya akan memberikan favorit pada pertanyaan Anda - jadi mungkin beberapa guru akan menjawab. Saya tertarik untuk mengetahui apakah ini dapat dilakukan
Bostone
@Steven Silakan posting kekhawatiran Anda sebagai pertanyaan lain, tidak berguna untuk menjawab dalam komentar dan ini adalah subjek lain.
Pascal Thivent
6
Itu dimaksudkan untuk menjadi pertanyaan utama, saya hanya mengklarifikasi. Apakah saya tidak menjelaskan dalam pertanyaan awal bahwa maksud saya adalah tidak mewajibkan produk yang dibangun berada di repositori lokal untuk membangun modul lain dalam proyek yang sama?
Steven Schlansker
104

Seperti yang telah didiskusikan di utas milis maven ini , dependensi: tujuan pohon dengan sendirinya akan mencari di repositori daripada di reactor. Anda dapat menyiasatinya dengan memasang mvn, seperti yang disarankan sebelumnya, atau melakukan sesuatu yang tidak terlalu memberatkan yang memanggil reaktor, seperti

mvn compile dependency:tree

Bekerja untuk saya.

Don Willis
sumber
2
Terima kasih untuk solusi murah itu. Tapi apakah itu bug? Saya mengharapkan ketergantungan: tujuan pohon bergantung pada reaktor tanpa trik apa pun.
mcoolive
Perlu dicatat bahwa situasi yang sama terjadi untuk tugas apa pun yang dijalankan secara global, tetapi hanya memengaruhi beberapa subproyek.
tkruse
Sayangnya, compilememicu download dependensi transitif. Apakah ada juga cara untuk membuat daftar pohon ketergantungan tanpa benar-benar mendownloadnya (kecuali POM, tentunya)?
sschuberth
Saya memiliki masalah yang sama untuk tujuan lain. Menambahkan compile( validatetidak cukup) membantu di sana juga: mvn compile animal-sniffer:checkdanmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa
Bergantung pada build Anda, beberapa Modul mungkin juga memiliki dependensi ke artefak yang dibangun di fase selanjutnya. Dalam kasus saya, file ZIP (menggunakan maven-assembly-plugin) dibangun dalam packagefase, jadi saya perlu melakukan mis mvn package animal-sniffer:check.
msa
6

Menyadari ini adalah utas yang lebih lama tetapi tampaknya alat tersebut berevolusi atau ini mungkin terlewat pertama kali.

Dimungkinkan untuk melakukan build yang membuat dependensi diselesaikan tanpa menginstal dengan melakukan build reactor.

Jika Anda memulai build di induk yang mendeskripsikan struktur modul project Anda, maka dependensi antar modul Anda akan diselesaikan selama build itu sendiri melalui reaktor Maven internal.

Tentu saja ini bukan solusi yang tepat karena tidak menyelesaikan pembangunan modul individu tunggal dalam struktur. Dalam hal ini Maven tidak akan memiliki ketergantungan di reaktornya dan akan berusaha menyelesaikannya di repositori. Jadi untuk build individual Anda masih harus menginstal dependensi terlebih dahulu.

Berikut adalah beberapa referensi yang menggambarkan situasi ini.

Newtopian
sumber
1
Apakah ada cara untuk membangun satu modul, tanpa menginstal dependensi terlebih dahulu dan tanpa membangun proyek induk lengkap?
Memiliki QUIT - Anony-Mousse
1
Untuk melengkapi jawaban - jika plugin dipanggil secara langsung (tanpa fase) misalnya mvn dependency:tree, itu masih tidak akan menyelesaikan ketergantungan dari sumber kecuali Anda memanggil compilefase. Jadi ini akan bekerja sebagai gantinya: mvn compile dependency:tree.
Stanislav Bashkyrtsev
3

bagi saya, apa yang membawa saya ke utas ini adalah masalah yang sama dan solusinya adalah memastikan semua ketergantungan modul yang dimiliki pom

 <packaging>pom</packaging>

orang tua punya

pom

dep model saya memiliki pom - jadi tidak ada toples yang dapat ditemukan.

bsautner
sumber
Itu melempar kesalahan ini bagi saya: Parse error reading POM. Alasan: Tag tidak dikenal: 'kemasan'
hithwen
edit: maksud saya <packaging> pom </packaging> memperbaikinya. mengganti <packaging> jar </packaging>
bsautner
4
Ini memperbaiki masalah yang dijelaskan dalam pertanyaan, tetapi sekarang modul anak tidak menghasilkan arsip yang dapat diekspor (mis. Stoples, perang, telinga).
sheldonh
sheldonh apakah Anda menemukan solusi untuk memperbaiki kesalahan ini dan menghasilkan arsip yang dapat diekspor?
pengguna3853134
3

Satu-satunya hal yang berhasil bagi saya: beralih ke gradle :(

saya sudah

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

dan saya bisa cd di war1 dan menggunakan mvn tomcat7: run-war. Saya selalu harus menginstal keseluruhan proyek sebelumnya, meskipun war1 mereferensikan orang tuanya dan referensi induk war1 dan dep1 (sebagai modul) sehingga semua dependensi harus diketahui.

Saya tidak mengerti apa masalahnya.

mba
sumber
1
Inilah mengapa saya menggunakan gradle ketika saya harus membuat proyek multi-modul. :(
Zhuo YING
2

Dalam struktur modul Maven seperti ini:

- parent
  - child1
  - child2

Anda akan memiliki parent pomini:

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

Jika Anda sekarang tergantung pada child1di child2dengan menempatkan berikut di Anda <dependencies>di child2:

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

Anda akan menerima pesan kesalahan yang JARnya child1tidak dapat ditemukan. Ini dapat diselesaikan dengan mendeklarasikan <dependencyManagement>blok termasuk child1di pomuntuk parent:

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

child1sekarang akan dibangun ketika Anda menjalankan tujuan compileatau packagedll parent, dan child2akan menemukan child1file yang telah dikompilasi.

baik
sumber
2

Memanfaatkan jawaban dari Don Willis :

Jika build Anda membuat test-jars untuk membagikan kode pengujian di antara submodul reaktor Anda, Anda harus menggunakan:

mvn test-compile dependency:tree

yang akan memungkinkan dependency:treeuntuk berjalan hingga selesai dalam kasus ini.

adrock20
sumber
-1

Pastikan modul yang gagal diselesaikan di pom, mengarah ke induk yang benar dengan memasukkan konfigurasi di file pom modul.

Nitin Kamate
sumber