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:tree
dan 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 ...
sumber
Jawaban:
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 install
proyek milik bersama terlebih dahulu, semuanya akan berhasil.sumber
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.
sumber
compile
memicu download dependensi transitif. Apakah ada juga cara untuk membuat daftar pohon ketergantungan tanpa benar-benar mendownloadnya (kecuali POM, tentunya)?compile
(validate
tidak cukup) membantu di sana juga:mvn compile animal-sniffer:check
danmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
package
fase, jadi saya perlu melakukan mismvn package animal-sniffer:check
.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.
sumber
mvn dependency:tree
, itu masih tidak akan menyelesaikan ketergantungan dari sumber kecuali Anda memanggilcompile
fase. Jadi ini akan bekerja sebagai gantinya:mvn compile dependency:tree
.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.
sumber
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.
sumber
Dalam struktur modul Maven seperti ini:
- parent - child1 - child2
Anda akan memiliki
parent
pom
ini:<modules> <module>child1</module> <module>child2</module> </modules>
Jika Anda sekarang tergantung pada
child1
dichild2
dengan menempatkan berikut di Anda<dependencies>
dichild2
:<dependency> <groupId>example</groupId> <artifactId>child1</artifactId> </dependency>
Anda akan menerima pesan kesalahan yang JARnya
child1
tidak dapat ditemukan. Ini dapat diselesaikan dengan mendeklarasikan<dependencyManagement>
blok termasukchild1
dipom
untukparent
:<dependencyManagement> <dependencies> <dependency> <groupId>example</groupId> <artifactId>child1</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement>
child1
sekarang akan dibangun ketika Anda menjalankan tujuancompile
ataupackage
dllparent
, danchild2
akan menemukanchild1
file yang telah dikompilasi.sumber
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:tree
untuk berjalan hingga selesai dalam kasus ini.sumber
Pastikan modul yang gagal diselesaikan di pom, mengarah ke induk yang benar dengan memasukkan konfigurasi di file pom modul.
sumber