2009-02-20 19 views
47

Tôi chỉ mới bắt đầu sử dụng Maven, (đánh giá nó, thực sự) và tôi cần để có thể nhanh chóng tạo một tệp JAR cho ứng dụng của tôi và một thư mục với tất cả các phụ thuộc (ví dụ: lib) để tôi có thể triển khai hai người đó sẽ được điều hành một cách độc lập. Tạo tệp JAR với tệp kê khai thích hợp rất dễ, nhưng tôi không biết cách để Maven sao chép các phụ thuộc cho dự án hiện tại vào thư mục lib mà tôi có thể triển khai.Maven có thể thu thập tất cả các JAR phụ thuộc cho một dự án để trợ giúp triển khai ứng dụng không?

Vì đây là một ứng dụng Java độc lập, tôi không phải quan tâm đến việc triển khai vào kho lưu trữ Maven, cũng khá tầm thường hoặc ít nhất là dễ dàng googleable.

Tôi đã tìm hiểu cách thực hiện mọi thứ ngoại trừ sao chép các tệp JAR phụ thuộc vào một số thư mục được chỉ định. Đây là công việc tôi đang tìm kiếm:

$ mvn clean 
$ mvn package 
$ cp -r target/{lib,myApp.jar} installLocation 

Sau đó, chạy myApp.jar từ installLocation như một tập tin JAR nên "chỉ làm việc" bất kể $CLASSPATH tôi.

Để thử và tiền empt một số câu trả lời:

  • Tôi có một phương thức main-lớp: thiết lập, và nó hoạt động tốt.
  • Tôi cũng đã đặt đường dẫn lớp trong MANIFEST.MF và cũng hoạt động tốt.
  • Tôi đã tìm hiểu cách sử dụng <classpathPrefix><classpathMavenRepositoryLayout> để thực hiện công việc này - nhưng chỉ trên máy của tôi. (qua: <classpathPrefix>${settings.localRepository}</classpathPrefix>)

Trả lời

73

Điều bạn muốn điều tra là Maven's dependency plugin. Thêm nội dung nào đó tương tự như sau vào pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <configuration> 
     <outputDirectory> 
      ${project.build.directory} 
     </outputDirectory> 
    </configuration> 
</plugin> 

Sau đó chạy mvn clean dependency:copy-dependencies để sao chép thực hiện sao chép. Kết hợp điều này với assembly plugin và bạn có thể gói mọi thứ vào một kho lưu trữ riêng để phân phối.

+0

gia tăng này để pom.xml của tôi bên trong Eclipse. Không có gì xảy ra –

+0

Tôi phải tải xuống maven bên ngoài nhật thực, thêm thư mục/bin vào đường dẫn của tôi rồi chạy 'mvn dependency: copy-dependencies'. VÂNG! Bây giờ nó hoạt động, Maven làm những gì nó được cho là phải làm! Bây giờ nó chỉ là để sao chép tất cả * .jar vào dự án của tôi và thêm vào đường dẫn xây dựng của tôi –

3

Chắc chắn là có thể. Bạn cần sử dụng số shade plugin có thể được thực hiện bằng cách thêm

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.3-SNAPSHOT</version> 
     <configuration> 
      <!-- put your configurations here --> 
     </configuration> 
     </plugin> 

vào dự án của bạn.

6

Tuy nhiên, một số khác là appassembler plugin
Những gì tôi thích về nó là nó gói ứng dụng trong một hình thức sẵn sàng để sử dụng (với một ans tập tin .bat như vậy)

7

Tôi không quan tâm cho các plugin Shade từ nó cuộn tất cả các gói từ tất cả các lọ lại với nhau.

Để bao gồm tất cả các lib bên ngoài, bạn có thể sử dụng Plugin phụ thuộc như đã đề cập ở trên.

Ví dụ này sẽ tạo thư mục "lib" trong "target/classes" trước phần "package".

 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>target/classes/lib</outputDirectory> 
     <overWriteIfNewer>true</overWriteIfNewer> 
     <excludeGroupIds> 
      junit,org.hamcrest,org.mockito,org.powermock,${project.groupId} 
     </excludeGroupIds> 
     </configuration> 
    </execution> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
     <goal>sources</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <verbose>true</verbose> 
    <detail>true</detail> 
    <outputDirectory>${project.build.directory}</outputDirectory> 
    </configuration> 
</plugin> 
2

Hãy xem plugin phụ thuộc của maven, cụ thể là mục tiêu sao chép phụ thuộc. Phần sử dụng mô tả cách thực hiện chính xác những gì bạn muốn.

Để làm điều đó từ dòng lệnh chỉ làm:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 
-1

Sử dụng maven.repo.local người ta có thể thu thập tất cả lọ, nhưng, họ được thu thập vào một thư mục với hệ thống phân cấp maven (.m2) .

mvn install -Dmaven.repo.local=./pick/some/folder 

Sau đó bạn có thể thu thập chúng (trên Linux):

mkdir flat-repo 
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/ 
Các vấn đề liên quan