Maven ไม่รู้จักโมดูลพี่น้องเมื่อรัน mvn dependency: tree


90

ฉันกำลังพยายามตั้งค่าโครงการ Maven แบบหลายโมดูลและดูเหมือนว่าการพึ่งพาระหว่างโมดูลนั้นไม่ได้รับการตั้งค่าอย่างถูกต้อง

ฉันมี:

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

ใน POM แม่ (ซึ่งมีปอมชนิดบรรจุภัณฑ์) และไดเร็กทอรีย่อยcommons/และstorage/กำหนด JAR poms ที่มีชื่อเดียวกัน

การจัดเก็บขึ้นอยู่กับคอมมอนส์

ในไดเร็กทอรีหลัก (หลัก) ฉันเรียกใช้mvn dependency:treeและดู:

[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

เหตุใดการพึ่งพา "คอมมอนส์" จึงล้มเหลวแม้ว่าเครื่องปฏิกรณ์จะเห็นได้ชัดว่าเป็นเพราะมันประมวลผลโครงสร้างการพึ่งพาได้สำเร็จ มันไม่ควรไปที่ 'เน็ตเพื่อค้นหามันอย่างแน่นอน ...

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>

ขอบคุณสำหรับคำแนะนำ!

(แก้ไข)

เพื่อชี้แจงสิ่งที่ฉันกำลังมองหาที่นี่คือ: ฉันไม่ต้องการติดตั้งโมดูล X เพื่อสร้างโมดูล Y ซึ่งขึ้นอยู่กับ X เนื่องจากทั้งสองเป็นโมดูลที่อ้างอิงจาก POM หลักเดียวกัน สิ่งนี้ทำให้ฉันเข้าใจได้ง่ายว่าถ้าฉันมีสองสิ่งในแผนผังแหล่งเดียวกันฉันไม่ควรต้องติดตั้งผลิตภัณฑ์ระดับกลางเพื่อสร้างต่อ หวังว่าความคิดของฉันจะสมเหตุสมผลที่นี่ ...


2
อ่าแก้ไขได้สมบูรณ์แบบ ทำไมคุณไม่เขียนสิ่งนี้ในความตั้งใจแรก? นอกจากนี้อาจพิจารณาเปลี่ยนชื่อเรื่อง :) ฉันไม่ได้ตั้งใจจู้จี้จุกจิก แต่เป็นเพียงเพื่อความชัดเจนและการจัดหมวดหมู่ สิ่งนี้จะช่วยทั้งชุมชนในอนาคตเมื่อค้นหาปัญหาที่คล้ายกัน (ซึ่งไม่ชัดเจนกับชื่อจริงและเนื้อหาที่เกี่ยวกับการพึ่งพา: ต้นไม้)
Pascal Thivent

1
สวัสดี. คุณพบทางออกหรือไม่? ฉันก็มีปัญหานี้เหมือนกัน :(

1
การคอมไพล์ล้มเหลวหรือเป็นเพียงการพึ่งพา: เป้าหมายแบบต้นไม้เพียงอย่างเดียว? ดูคำตอบของ Don Willis
metamatt

OMG ดังนั้นในโมดูลหนึ่งหากล้มเหลวเนื่องจากไม่พบสัญลักษณ์ของโมดูลอื่นควรเพิ่มอีกโมดูลหนึ่งเป็นการอ้างอิงและติดตั้งเป็น JAR? นี่คือกุญแจสำคัญ ....
WesternGun

เป็นเรื่องน่าเศร้าที่ maven 3.6 ยังไม่สามารถแก้ปัญหานี้ได้
yuxh

คำตอบ:


21

ฉันคิดว่าปัญหาคือเมื่อคุณระบุการพึ่งพา Maven คาดว่าจะมีเป็น jar (หรืออะไรก็ตาม) ที่บรรจุและมีให้จาก repo ในพื้นที่เป็นอย่างน้อย ฉันแน่ใจว่าถ้าคุณรันmvn installโครงการคอมมอนส์ก่อนทุกอย่างจะใช้ได้


4
มีวิธีระบุหรือไม่ว่าฉันต้องการให้ใช้โมดูลเวอร์ชันใดในแผนผังต้นทาง ฉันคิดว่ากรณีนี้จะได้รับการจัดการโดยอัตโนมัติ ฉันไม่ต้องการ / ไม่คิดว่า Maven จำเป็นต้องสร้าง - ติดตั้ง - สร้าง - ติดตั้ง - สร้างทุกครั้งที่ฉันต้องการสร้างโครงการทั้งหมด!
Steven Schlansker

38
คุณถูกต้องที่เรียกใช้การติดตั้งแก้ไขได้ อย่างไรก็ตามตอนนี้ฉันต้องติดตั้งทุกครั้งที่ทำการเปลี่ยนแปลงซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการให้โปรเจ็กต์พื้นที่เก็บข้อมูลรับโค้ดล่าสุดจากโปรเจ็กต์คอมมอนส์
Steven Schlansker

ฉันต้องจัดการกับปัญหาที่คล้ายกันและอนิจจา - ฉันยังหาคำตอบไม่ได้ ดูเหมือนว่า Maven จะไม่สนใจว่าการอ้างอิงนั้นเชื่อมโยงกับโมดูลของคุณเพียงแค่ไปที่ repo ทันที ฉันจะใส่คำถามของคุณเป็นรายการโปรด - ดังนั้นกูรูบางคนอาจจะตอบ ฉันสนใจที่จะทราบว่าสามารถทำได้หรือไม่
Bostone

@Steven โปรดโพสต์ความกังวลของคุณเป็นคำถามอื่นมันไม่สะดวกที่จะตอบในความคิดเห็นและนี่เป็นอีกเรื่องหนึ่ง
Pascal Thivent

6
นั่นเป็นคำถามหลักฉันเพียงแค่ชี้แจง ฉันไม่ได้อธิบายให้ชัดเจนในคำถามเดิมว่าเจตนาของฉันคือไม่ต้องการให้ผลิตภัณฑ์ที่สร้างขึ้นอยู่ในที่เก็บในเครื่องเพื่อสร้างโมดูลอื่น ๆ ในโครงการเดียวกันหรือไม่
Steven Schlansker

104

ตามที่กล่าวไว้ในเธรดรายชื่ออีเมล maven นี้การพึ่งพา: เป้าหมายต้นไม้ด้วยตัวมันเองจะค้นหาสิ่งต่างๆในที่เก็บแทนที่จะเป็นเครื่องปฏิกรณ์ คุณสามารถแก้ไขปัญหานี้ได้โดยการติดตั้ง mvn ตามที่แนะนำไว้ก่อนหน้านี้หรือทำสิ่งที่ยุ่งยากน้อยกว่าที่เรียกใช้เครื่องปฏิกรณ์เช่น

mvn compile dependency:tree

ใช้ได้ผลสำหรับฉัน


2
ขอบคุณสำหรับวิธีแก้ปัญหาราคาถูก แต่มันเป็นบั๊ก? ฉันคาดหวังการพึ่งพา: เป้าหมายของต้นไม้อาศัยเครื่องปฏิกรณ์โดยไม่มีกลอุบายใด ๆ
mcoolive

ควรสังเกตว่าสถานการณ์เดียวกันนี้เกิดขึ้นกับงานใด ๆ ที่ทำงานทั่วโลก แต่มีผลกับบางโครงการย่อยเท่านั้น
tkruse

น่าเสียดายที่compileทริกเกอร์การดาวน์โหลดการอ้างอิงสกรรมกริยา นอกจากนี้ยังมีวิธีการแสดงรายการแผนผังการพึ่งพาโดยไม่ต้องดาวน์โหลดจริง ๆ (ยกเว้น POMs แน่นอน)
sschuberth

ฉันมีปัญหาเดียวกันสำหรับเป้าหมายอื่น ๆ การเพิ่มcompile( validateไม่เพียงพอ) ช่วยที่นั่นด้วย: mvn compile animal-sniffer:checkและmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa

โมดูลบางโมดูลอาจมีการอ้างอิงกับอาร์ติแฟกต์ที่สร้างในเฟสต่อ ๆ ไปทั้งนี้ขึ้นอยู่กับการสร้างของคุณ ในกรณีของฉันไฟล์ ZIP (โดยใช้ maven-assembly-plugin) ถูกสร้างขึ้นในpackageเฟสดังนั้นฉันต้องทำเช่นmvn package animal-sniffer:check.
msa

6

ตระหนักว่านี่เป็นเธรดที่เก่ากว่า แต่ดูเหมือนว่าเครื่องมือจะพัฒนาขึ้นหรืออาจพลาดไปในครั้งแรก

เป็นไปได้ที่จะทำการสร้างที่ทำให้การอ้างอิงได้รับการแก้ไขโดยไม่ต้องติดตั้งโดยการสร้างเครื่องปฏิกรณ์

หากคุณเริ่มบิวด์ในพาเรนต์ที่อธิบายโครงสร้างโมดูลของโปรเจ็กต์ของคุณการอ้างอิงระหว่างโมดูลของคุณจะได้รับการแก้ไขในระหว่างการสร้างตัวเองผ่านเครื่องปฏิกรณ์ Maven ภายใน

แน่นอนว่านี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์แบบเนื่องจากไม่ได้แก้ปัญหาการสร้างโมดูลเดี่ยวภายในโครงสร้าง ในกรณีนี้ Maven จะไม่มีการพึ่งพาในเครื่องปฏิกรณ์ของเขาและจะพยายามหาวิธีแก้ไขในที่เก็บ ดังนั้นสำหรับแต่ละบิลด์คุณยังต้องติดตั้งการอ้างอิงก่อน

นี่คือข้อมูลอ้างอิงบางส่วนที่อธิบายสถานการณ์นี้


1
มีวิธีใดบ้างในการสร้างโมดูลเดียวโดยไม่ต้องติดตั้งการอ้างอิงก่อนและไม่ต้องสร้างโครงการพาเรนต์ที่สมบูรณ์
มี QUIT - Anony-Mousse

1
เพื่อให้คำตอบสมบูรณ์ - หากเรียกใช้ปลั๊กอินโดยตรง (ไม่มีเฟส) เช่นปลั๊กอินจะmvn dependency:treeยังไม่แก้ไขการอ้างอิงจากแหล่งที่มาเว้นแต่คุณจะเรียกใช้compileเฟส mvn compile dependency:treeดังนั้นนี้จะทำงานแทน:
Stanislav Bashkyrtsev

3

สำหรับฉันสิ่งที่ทำให้ฉันไปที่เธรดนี้คือปัญหาที่คล้ายกันและวิธีแก้ปัญหาคือเพื่อให้แน่ใจว่าปอมพึ่งพาโมดูลทั้งหมดมี

 <packaging>pom</packaging>

ผู้ปกครองมี

ปอม

โมเดลของฉันมีปอม - จึงไม่พบขวดโหล


นั่นทำให้เกิดข้อผิดพลาดนี้สำหรับฉัน: แยกวิเคราะห์ข้อผิดพลาดในการอ่าน POM เหตุผล: แท็กที่ไม่รู้จัก: 'บรรจุภัณฑ์'
hithwen

แก้ไข: ฉันหมายถึง <packaging> pom </packaging> แก้ไข การเปลี่ยน <packaging> jar </packaging>
bsautner

4
วิธีนี้แก้ไขปัญหาที่อธิบายไว้ในคำถาม แต่ตอนนี้โมดูลลูกไม่ได้สร้างไฟล์เก็บถาวรที่สามารถส่งออกได้ (เช่นไหสงครามหู)
sheldonh

คุณเชลดอนพบวิธีแก้ไขข้อผิดพลาดนี้และสร้างไฟล์เก็บถาวรที่สามารถส่งออกได้หรือไม่
user3853134

3

สิ่งเดียวที่ใช้ได้ผลสำหรับฉัน: การเปลี่ยนไปใช้ gradle :(

ฉันมี

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

และฉันสามารถ cd ใน war1 และใช้ mvn tomcat7: run-war ฉันต้องติดตั้งโปรเจ็กต์ทั้งหมดก่อนเสมอแม้ว่า war1 จะอ้างถึงพาเรนต์ของเขาและพาเรนต์อ้างอิง war1 และ dep1 (เป็นโมดูล) ดังนั้นควรทราบการอ้างอิงทั้งหมด

ฉันไม่เข้าใจว่าปัญหาคืออะไร


1
นี่คือเหตุผลที่ฉันใช้ gradle เมื่อฉันต้องสร้างโครงการหลายโมดูล :(
Zhuo YING

2

ในโครงสร้างโมดูล Maven ดังนี้:

- parent
  - child1
  - child2

คุณจะมีสิ่งparent pomนี้:

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

ถ้าคุณตอนนี้ขึ้นอยู่กับchild1ในchild2โดยวางต่อไปในของคุณ<dependencies>ในchild2:

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

คุณจะได้รับข้อผิดพลาดที่child1ไม่พบJAR สำหรับ สิ่งนี้สามารถแก้ไขได้โดยการประกาศ<dependencyManagement>บล็อกรวมถึงchild1ในไฟล์pomสำหรับparent:

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

child1ตอนนี้จะถูกสร้างขึ้นเมื่อคุณเรียกใช้เป้าหมายcompileหรือpackageอื่น ๆparentและchild2จะพบchild1ไฟล์ที่คอมไพล์แล้ว


2

โดยไม่ได้รับคำตอบจากDon Willis :

หากบิวด์ของคุณสร้างขวดทดสอบเพื่อแชร์โค้ดทดสอบระหว่างโมดูลย่อยของเครื่องปฏิกรณ์คุณควรใช้:

mvn test-compile dependency:tree

ซึ่งจะอนุญาตให้dependency:treeทำงานจนเสร็จสมบูรณ์ในกรณีนี้


-1

ตรวจสอบให้แน่ใจว่าโมดูลที่ล้มเหลวได้รับการแก้ไขใน pom ชี้ไปที่พาเรนต์ที่ถูกต้องโดยรวมการกำหนดค่าไว้ในไฟล์ pom ของโมดูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.