2011-07-08 39 views
5

Tôi mới làm quen với maven và phần nào mới đối với java. Đã thử google và các nguồn có liên quan, nhưng tôi không tìm thấy nguồn nào giống với tình huống của tôi.không phụ thuộc vào thời gian chạy maven

Hiện tại, tôi có dự án maven XY. X có thể được xem như là một thư viện được chia sẻ với một số tiện ích, Y là một đơn giản JFrame với một "hello world" được in và gọi đến một phương pháp tĩnh trong X.

Tôi thực hiện "chạy dưới dạng maven install" trên dự án X, tôi nhận được "build successful". Tôi thêm dự án X làm phụ thuộc trong dự án Y (sử dụng trình soạn thảo pom trong Eclipse, duyệt kho lưu trữ và định vị nó). Tôi thực hiện "chạy dưới dạng maven package" trên dự án Y, tôi nhận được "build successful". Khi chạy dự án Y hoặc thông qua java -jar hoặc kiểm tra bình được sản xuất, dự án X bị thiếu ở khắp mọi nơi và tôi nhận được một lớp học lạ mắt không tìm thấy ngoại lệ. Eclipse tìm thấy nó và không có lỗi biên dịch trong trình soạn thảo nguồn.

Tại sao nó chỉ hoạt động trong trình chỉnh sửa Eclipse chứ không phải là jar?

POM:

<dependency> 
     <groupId>com.company.deployment.shared</groupId> 
     <artifactId>com.company.deployment.shared</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <scope>compile</scope> 
    </dependency> 

Trả lời

7

Maven không tạo ra một tập tin JAR kết hợp cho bạn. Những gì Eclipse đang làm là xem xét cấu hình Maven và thêm tất cả các lớp/lọ cần thiết vào classpath của bạn cho bạn khi nó chạy.

Nếu bạn muốn chạy chương trình của mình từ dòng lệnh, bạn sẽ cần thêm tất cả các JAR theo cách thủ công vào đường dẫn lớp của bạn.

Hoặc, bạn có thể chạy chương trình directly from Maven để thiết lập tất cả các phụ thuộc của bạn. Có một số tùy chọn tùy thuộc vào những gì bạn muốn làm, tức là nếu đó là một ứng dụng có nghĩa là được điều hành bởi người dùng cuối, bạn có thể xem xét one-jar Maven plugin.

0

Nó không hoạt động vì Maven giải quyết các phụ thuộc khi xây dựng dự án của bạn, nhưng không đặt tất cả các phụ thuộc kỳ diệu vào bình của bạn. Bạn đang phải chạy ứng dụng của bạn với tất cả các phụ thuộc của nó trong classpath:

java -classpath X.jar;Y.jar com.foo.bar.Main 

Hoặc bạn phải tùy chỉnh các plugin maven jar để tạo ra một jar thực thi, như mô tả here. Và bạn cũng có thể sử dụng plugin assemby maven để sao chép tất cả các phụ thuộc của dự án Y của bạn vào thư mục đích, bên cạnh Y.jar được tạo ra.

+0

Tha thứ cho tôi nếu tôi thấy khó khăn này, tôi đến từ một thế giới .net và bán hàng của tôi dpt đã bán cho tôi một dự án java để làm. Nhưng đối với một số lý do, maven chỉ kiểm tra nếu phụ thuộc có nhưng không thêm chúng? Cảm ơn bạn đã tip vào jar thực thi, nhưng vì nó bây giờ, tất cả các phụ thuộc vẫn còn thiếu ... Làm thế nào tôi có thể gói này theo cách mà khách hàng của tôi có thể sử dụng nó? Tôi chắc chắn hy vọng họ không cần dòng lệnh này ...? – Helfdane

+0

@Helfdane - lý do nó không đặt phụ thuộc vào JAR của bạn là điều này sẽ không phải là điều đúng để làm trong hầu hết các trường hợp. Và đối với những trường hợp ở đó, có rất nhiều plugin để làm điều đó. –

0

Tôi khuyên bạn nên xem qua số Maven shade plugin. Điều này tạo ra một "uber-jar" bao gồm dự án của bạn và tất cả các phụ thuộc của nó. Nó cũng có thể làm những việc khác như thiết lập lớp điểm vào để làm cho tệp JAR của bạn là một tệp JAR thực thi.

+0

Sẽ có một cái nhìn vào nó, thanx cho tip. – Helfdane

1

Bạn cũng có thể tìm exec-maven-plugin hữu ích

mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ... 
mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist" 

Nếu khách hàng của bạn không thể tải phụ thuộc từ maven m2 repo trên bay như đằng sau bức tường lửa hoặc không có kết nối internet, sau đó bạn cũng cần phải gói phụ thuộc sử dụng maven-dependency-plugin để sao chép tất cả các phụ thuộc và maven-assembly-plugin để lắp ráp các phụ thuộc

0

Tạo phẩm được tạo ra trong dự án Y chỉ chứa kết quả xây dựng trong dự án Y, không bao gồm các phụ thuộc của dự án.

Nếu bạn muốn xây dựng một JAR trong Y, bạn có thể thực thi trực tiếp, bạn có thể xem xét sử dụng plugin lắp ráp.

Ví dụ, cách dễ nhất để xây dựng một uber-jar cho dự án Y:

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.1</version> 
     <configuration> 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-all-in-one-jar</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
      ... 
</project> 

Ngoài một vật bình thường, một hội đồng, trong đó có các lớp học vv từ phụ thuộc sẽ được tạo ra, đó là phù hợp với thể được thực hiện bởi java -jar

truy cập http://maven.apache.org/plugins/maven-assembly-plugin/ để sử dụng tinh vi hơn.

0

Phil Sacre đã giải thích tốt vấn đề cơ bản (về cơ bản không có thông tin về nơi tìm thấy X.jar được nhúng trong Y.jar của bạn). Ngoài ra, bạn cũng có thể xem appassembler-maven-plugin (ví dụ: có thể tạo tập lệnh khởi chạy cho dự án Y của bạn đã có tập đường dẫn đúng) và/hoặc exec-maven-plugin (bạn có thể sử dụng để khởi chạy trực tiếp Y với classpath phù hợp) sử dụng maven).

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