Maven không nhận ra các mô-đun anh chị em khi chạy phụ thuộc mvn: tree


90

Tôi đang cố gắng thiết lập một dự án Maven nhiều mô-đun và các phần phụ thuộc giữa các mô-đun dường như không được thiết lập chính xác.

Tôi có:

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

trong POM mẹ (có pom kiểu đóng gói) và sau đó là các thư mục con commons/storage/định nghĩa các JAR poms có cùng tên.

Lưu trữ phụ thuộc vào Commons.

Trong thư mục chính (chính), tôi chạy mvn dependency:treevà thấy:

[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

Tại sao sự phụ thuộc vào "commons" không thành công, mặc dù lò phản ứng rõ ràng đã nhìn thấy nó vì nó xử lý thành công cây phụ thuộc của nó? Nó chắc chắn không nên vào 'mạng để tìm nó vì nó ở ngay đó ...

Pom để lưu trữ:

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

Cảm ơn vì bất kỳ đề xuất!

(Biên tập)

Để làm rõ, những gì tôi đang tìm kiếm ở đây là: Tôi không muốn phải cài đặt mô-đun X để xây dựng mô-đun Y phụ thuộc vào X, vì cả hai đều là mô-đun được tham chiếu từ cùng một POM mẹ. Điều này có ý nghĩa trực quan đối với tôi rằng nếu tôi có hai thứ trong cùng một cây nguồn, tôi không cần phải cài đặt các sản phẩm trung gian để tiếp tục xây dựng. Hy vọng rằng suy nghĩ của tôi có ý nghĩa ở đây ...


2
Ahhh, Bản chỉnh sửa hoàn hảo. Tại sao bạn không viết điều này trong ý định đầu tiên? Ngoài ra, có thể cân nhắc đổi tiêu đề :) Tôi không có ý cầu kỳ, cái này chỉ nhằm mục đích rõ ràng và phân loại. Điều này sẽ giúp cả cộng đồng trong tương lai khi tìm kiếm một vấn đề tương tự (mà không phải là tinh thể rõ ràng với tiêu đề thực tế và nội dung mà là về sự phụ thuộc: cây)
Pascal Thivent

1
Chào. Bạn đã tìm ra giải pháp? Tôi có vấn đề này quá :(

1
Quá trình biên dịch có thất bại không, hay chỉ có sự phụ thuộc: cây mục tiêu? Hãy xem câu trả lời của Don Willis.
metamatt

OMG vì vậy trong một mô-đun nếu nó không thành công vì nó không thể tìm thấy các ký hiệu của mô-đun khác, thì mô-đun kia nên được thêm vào như là phụ thuộc và cài đặt như JAR? Đây là chìa khóa ....
WesternGun

nó buồn maven 3.6 không giải quyết vấn đề này được nêu ra
yuxh

Câu trả lời:


21

Tôi nghĩ rằng vấn đề là khi bạn chỉ định một phụ thuộc, Maven mong đợi nó ở dạng jar (hoặc bất cứ thứ gì) được đóng gói và có sẵn từ ít nhất một repo cục bộ. Tôi chắc chắn rằng nếu bạn chạy mvn installtrên dự án chung của mình trước tiên thì mọi thứ sẽ hoạt động.


4
Có cách nào để chỉ định rằng tôi muốn nó sử dụng bất kỳ phiên bản nào của mô-đun trong cây nguồn không? Tôi đã nghĩ rằng trường hợp này sẽ được xử lý tự động. Tôi không muốn / không nghĩ rằng Maven yêu cầu phải build-install-build-install-build mỗi khi tôi chỉ muốn tạo toàn bộ dự án!
Steven Schlansker

38
Bạn đúng là đang chạy cài đặt sẽ sửa được. Tuy nhiên, bây giờ tôi phải cài đặt mỗi khi thực hiện thay đổi, đó không phải là điều tôi muốn. Tôi muốn dự án lưu trữ nhận mã mới nhất từ ​​dự án commons.
Steven Schlansker

Tôi thực sự phải đối phó với những vấn đề tương tự và than ôi - cho đến nay tôi vẫn chưa thể tìm ra câu trả lời. Có vẻ như Maven không quan tâm rằng sự phụ thuộc được liên kết với mô-đun của bạn, nó chỉ cần repo ngay lập tức. Tôi sẽ đặt mục yêu thích cho câu hỏi của bạn - vì vậy có thể một số chuyên gia sẽ trả lời. Tôi muốn tìm hiểu xem điều này có thể được thực hiện hay không
Bostone

@Steven Vui lòng đăng mối quan tâm của bạn dưới dạng một câu hỏi khác, không tiện trả lời trong một bình luận và đây là một chủ đề khác.
Pascal Thivent

6
Đó được dự định là câu hỏi chính, tôi chỉ đơn giản là làm rõ. Có phải tôi đã không nói rõ trong câu hỏi ban đầu rằng mục đích của tôi là không yêu cầu các sản phẩm đã xây dựng phải nằm trong kho lưu trữ cục bộ để xây dựng các mô-đun khác trong cùng một dự án không?
Steven Schlansker

104

Như đã thảo luận trong chuỗi danh sách gửi thư này , bản thân mục tiêu cây phụ thuộc: sẽ tìm kiếm mọi thứ trong kho lưu trữ hơn là lò phản ứng. Bạn có thể giải quyết vấn đề này bằng cách cài đặt mvn, như đã đề xuất trước đó hoặc làm điều gì đó ít nguy hiểm hơn mà gọi lò phản ứng, chẳng hạn như

mvn compile dependency:tree

Làm việc cho tôi.


2
Cảm ơn bạn vì cách giải quyết rẻ tiền đó. Nhưng nó có phải là một lỗi? Tôi mong đợi sự phụ thuộc: mục tiêu cây dựa vào lò phản ứng mà không cần bất kỳ thủ thuật nào.
mcoolive

Cần lưu ý rằng tình huống tương tự cũng xảy ra cho bất kỳ tác vụ nào được chạy trên toàn cầu, nhưng chỉ ảnh hưởng đến một số dự án con.
tkruse

Thật không may, compilekích hoạt tải xuống các phụ thuộc bắc cầu. Có cách nào để liệt kê cây phụ thuộc mà không thực sự tải chúng xuống (tất nhiên là ngoại trừ POM) không?
sschuberth

Tôi đã gặp vấn đề tương tự cho các mục tiêu khác. Thêm compile( validatekhông đủ) cũng giúp ở đó: mvn compile animal-sniffer:checkmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa

Tùy thuộc vào bản dựng của bạn, một số Mô-đun cũng có thể phụ thuộc vào các tạo tác được xây dựng trong các giai đoạn sau. Trong trường hợp của tôi, một tệp ZIP (sử dụng maven-assembly-plugin) đã được xây dựng trong packagegiai đoạn, vì vậy tôi cần làm như vậy mvn package animal-sniffer:check.
msa

6

Nhận thấy đây là một chủ đề cũ hơn nhưng có vẻ như công cụ đã phát triển hoặc điều này có thể đã bị bỏ lỡ lần đầu tiên.

Có thể thực hiện một bản dựng giúp giải quyết các phụ thuộc mà không cần cài đặt bằng cách xây dựng lò phản ứng.

Nếu bạn bắt đầu bản dựng của mình trong phần mẹ mô tả cấu trúc mô-đun của dự án thì sự phụ thuộc giữa các mô-đun của bạn sẽ được giải quyết trong quá trình xây dựng chính nó thông qua lò phản ứng Maven bên trong.

Tất nhiên đây không phải là giải pháp hoàn hảo vì nó không giải quyết được việc xây dựng một mô-đun riêng lẻ trong cấu trúc. Trong trường hợp này, Maven sẽ không có sự phụ thuộc trong lò phản ứng của mình và ong sẽ tìm cách giải quyết nó trong kho lưu trữ. Vì vậy, đối với các bản dựng riêng lẻ, bạn vẫn phải cài đặt các phụ thuộc trước.

Dưới đây là một số tài liệu tham khảo mô tả tình huống này.


1
Có cách nào để xây dựng một mô-đun đơn lẻ mà không cần cài đặt các phụ thuộc trước và không cần xây dựng dự án mẹ hoàn chỉnh không?
Có QUIT - Anony-Mousse

1
Để hoàn thành câu trả lời - nếu plugin được gọi trực tiếp (không có giai đoạn) mvn dependency:tree, ví dụ , nó vẫn sẽ không giải quyết các phụ thuộc từ các nguồn trừ khi bạn gọi compilegiai đoạn. Vì vậy, đây sẽ làm việc thay vì: mvn compile dependency:tree.
Stanislav Bashkyrtsev 16/10/16

3

đối với tôi, điều dẫn tôi đến chủ đề này là một vấn đề tương tự và giải pháp là đảm bảo tất cả phụ thuộc mô-đun của pom đều có

 <packaging>pom</packaging>

cha mẹ đã có

pom

người mẫu của tôi có pom - vì vậy không có lọ nào được tìm thấy.


Điều đó gây ra lỗi này cho tôi: Lỗi phân tích cú pháp đọc POM. Lý do: Thẻ không được công nhận: 'bao bì'
hithwen

chỉnh sửa: ý tôi là <packaging> pom </packaging> đã sửa nó. thay thế <bao bì> jar </ bao bì>
bsautner

4
Điều này khắc phục sự cố được mô tả trong câu hỏi, nhưng bây giờ các mô-đun con không tạo ra các kho lưu trữ có thể xuất được (ví dụ như lọ, chiến tranh, tai).
sheldonh

sheldonh bạn đã tìm ra giải pháp để sửa lỗi này và tạo ra một kho lưu trữ có thể xuất khẩu chưa?
user3853134

3

Điều duy nhất phù hợp với tôi: chuyển sang gradle :(

Tôi có

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

và tôi chỉ có thể cd trong war1 và sử dụng mvn tomcat7: run-war. Tôi luôn phải cài đặt toàn bộ dự án trước đó, mặc dù war1 tham chiếu đến cha mẹ của anh ấy và cha mẹ tham chiếu war1 và dep1 (dưới dạng mô-đun), vì vậy tất cả các phụ thuộc phải được biết đến.

Tôi không hiểu vấn đề là gì.


1
Đây là lý do tại sao tôi sử dụng gradle khi tôi phải tạo dự án nhiều mô-đun. :(
Zhuo YING

2

Trong cấu trúc mô-đun Maven như thế này:

- parent
  - child1
  - child2

Bạn sẽ có trong cái parent pomnày:

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

Nếu bây giờ bạn phụ thuộc vào child1trong child2bằng cách đặt sau trong của bạn <dependencies>child2:

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

Bạn sẽ nhận được lỗi child1không thể tìm thấy JAR cho . Điều này có thể được giải quyết bằng cách khai báo một <dependencyManagement>khối bao gồm child1trong pomfor parent:

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

child1bây giờ sẽ được xây dựng khi bạn chạy một compilehoặc packagev.v. mục tiêu parentchild2sẽ tìm thấy child1các tệp đã biên dịch.


2

Thưởng cho câu trả lời từ Don Willis :

Nếu bản dựng của bạn tạo các lọ thử nghiệm để chia sẻ mã thử nghiệm giữa các mô-đun con của lò phản ứng, bạn nên sử dụng:

mvn test-compile dependency:tree

sẽ cho phép dependency:treechạy đến hoàn thành trong trường hợp này.


-1

Đảm bảo rằng mô-đun bị lỗi đã được giải quyết trong pom, đang trỏ đến nguồn gốc phù hợp bằng cách đưa các cấu hình vào tệp pom của mô-đun.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.