2012-11-13 28 views
7

Tôi có một sự phụ thuộcMaven: Thêm phụ thuộc địa phương để làm chao

<dependency> 
     <groupId>de.matthiasmann</groupId> 
     <artifactId>twl</artifactId> 
     <version>1.0.0</version> 
     <scope>system</scope> 
     <systemPath>${project.basedir}/lib/TWL.jar</systemPath> 
    </dependency> 

Sau đó, tôi thực hiện mvn assembly:assembly. Tất cả các tệp gốc và các thư viện maven từ xa được thêm vào, nhưng không có bình này.

CẬP NHẬT

Khi tôi đang cố gắng để chạy ứng dụng bằng cách java -jar myjar.jar. Nó trả về một lỗi mà không có lớp nào từ sự phụ thuộc ở trên (NoClassDefFoundError: de.matthiasmann.twl.ForExample). Tôi muốn thêm các lớp từ jar này vào myjar.jar (giống như những gì maven làm với các phụ thuộc từ xa). Làm thế nào tôi có thể cấu hình maven để làm điều đó?

+0

xin hãy giải thích –

+0

Nhìn vào câu trả lời từ @BlessedGeek và cũng trên có liên quan SO câu hỏi này: http://stackoverflow.com/questions/2229757/maven-add-a-dependency-to-a-jar-by-relative-path/2230464 # 2230464 – maba

+0

Tham khảo https://stackoverflow.com/a/45120371/1709793 – craftsmannadeem

Trả lời

7

Bạn không thể sử dụng systemPath, trừ khi máy chủ/vùng chứa Java EE của bạn có cấu hình jar đó.

Hãy nhớ rằng con quạ chỉ phát triển và biên dịch thôi. Khi tệp chiến tranh được tạo, maven không có tác dụng ngoại trừ việc đã đặt tất cả các lọ mong muốn vào thư mục WEB-INF/lib.

Khi bạn chỉ định phạm vi hệ thống, điều đó có nghĩa là bạn có trách nhiệm đảm bảo rằng bình có mặt khi chiến tranh được triển khai. Bạn đã có một khuôn khổ để thực hiện điều đó và bạn không muốn sửa đổi sự phụ thuộc xây dựng của bạn với cái bình đó, nhưng bạn phải làm cho nó có sẵn trong Maven chỉ trong quá trình phát triển.

Phạm vi tương tự khác là "được cung cấp". ví dụ: JBoss hoặc khung công tác triển khai chung của Tomcat đã cung cấp nhiều lọ như Spring và Hibernate được tải bởi máy chủ khởi động và phổ biến cho tất cả các ứng dụng trong máy chủ. Vì vậy, bạn sẽ không muốn xây dựng maven để bao gồm những người vào tập tin chiến tranh.

Cách phù hợp, Rất kinh nghiệm sẽ nói với bạn. là có máy chủ maven của riêng bạn và xây dựng bất kỳ đồ tạo tác nào bạn cần vào máy chủ đó. Tuy nhiên, đôi khi điều đó là không thể.

Vì vậy, trong những dịp như vậy, tôi tạo kho lưu trữ cấp dự án được phân phối với dự án và được kiểm tra vào kiểm soát phiên bản. Tôi chạy lệnh mvn install để tạo thư mục cấp dự án được gọi là "project-repo".

http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html (Do quen thuộc, phần lớn thời gian, tôi tạo repo bằng tay thay vì chạy cài đặt mvn).

Sau đó, trong POM, tôi chỉ định tệp: // $ {project.basedir}/project-repo làm một trong các kho lưu trữ. Thông báo trước với điều này là trong Windows, các dấu gạch chéo khác với cặp sau "file: //" phải là dấu gạch chéo ngược khi đề cập đến đường dẫn hệ thống tệp Windows.

<repositories> 
    <repository> 
     <id>my-repo1</id> 
     <name>my custom repo</name> 
     <url>http://ho.ho.ho</url> 
    </repository> 
    <repository> 
     <id>project-repo</id> 
     <name>my project repo</name> 
     <url>file://${project.basedir}\project-repo</url> 
    </repository> 
    </repositories> 
+1

Không có vấn đề gì khi sử dụng dấu gạch chéo chuyển tiếp '/'trong url của tệp trên cửa sổ. Điều đó hoạt động rất tốt. +1 BTW. – maba

0

Nếu bạn có một sự phụ thuộc đó là giải pháp tốt nhất là đầu tiên sử dụng một repository manager và chỉ cần đặt phụ thuộc đó vào quản lý kho và sau đó sử dụng nó phụ thuộc như đơn giản.

Các vấn đề liên quan