2009-06-18 36 views
8

Tôi thường gặp phải sự phân phối của các ứng dụng Java hoặc thư viện mà sử dụng Maven làm công cụ xây dựng của chúng.Java: Làm thế nào để xây dựng các bản phân phối độc lập của các dự án dựa trên Maven?

Một số trong số đó, đáng buồn thay, không cung cấp các lọ độc lập (hoặc có thể phân phối lại).

Có thể xây dựng các ứng dụng dựa trên Maven theo cách như vậy, kết quả xây dựng chứa tất cả các phụ thuộc và có thể được phân phối lại để làm việc ngoài hộp không?

Tôi đã cố gắng xây dựng mô-đun OCM của Jackrabbit. Vì một số lý do rất "thông minh", không có phiên bản độc lập có thể tải xuống .
Vì vậy, tôi đã xây dựng Jackrabbit với Maven (gói nguồn của Jackrabbit bao gồm OCM) và có cùng một cái bình như được tìm thấy trong apache repository. Bình không chứa các phụ thuộc cần thiết và là vô dụng cho tôi.

+0

Xem câu trả lời của tôi cho Maven Shade VS Assembly. Bóng râm là người chiến thắng rõ ràng. – opyate

+0

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#jar-with-dependencies –

Trả lời

0

Thay đổi tệp pom.xml và sử dụng chỉ thị <Embed-Dependency>. Một ví dụ tương tự có thể được tìm thấy here để bạn có thể điều chỉnh nó cho kịch bản của mình.

<Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency> 

Tôi nghĩ điều này nên thực hiện thủ thuật.


Đây là ví dụ tại URL ở trên dường như đã hết thời gian chờ.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>br.gov.lexml</groupId> 
    <artifactId>toolkit</artifactId> 
    <packaging>bundle</packaging> 
    <version>3.0</version> 
    <parent> 
     <artifactId>lexml</artifactId> 
     <groupId>br.gov.lexml</groupId> 
     <version>1.0</version> 
    </parent> 
    <build> 
     <finalName>Lexml_Toolkit-2.0</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.5</source> 
        <target>1.5</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <!--_include>src/toolkit/resources/META-INF/MANIFEST.MF</_include--> 

         <Export-Package>*;-split-package:=merge-last</Export-Package> 
         <Bundle-Activator>br.gov.lexml.borda.Toolkit</Bundle-Activator> 
         <Bundle-Name>Toolkit</Bundle-Name> 
         <Private-Package /> 
         <Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency> 
         <Bundle-ClassPath>.,{maven-dependencies}</Bundle-ClassPath> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.xmlbeans</groupId> 
      <artifactId>xmlbeans</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.xmlbeans</groupId> 
      <artifactId>xmlbeans-xmlpublic</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
     </dependency> 
     <dependency> 
      <groupId>br.gov.lexmlbeans</groupId> 
      <artifactId>lexmlbeans</artifactId> 
      <version>3.0</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

Kết quả liên kết của bạn trong thời gian chờ. Xin vui lòng cho tôi biết nơi để đưa chỉ thị. Tôi không thể tìm thấy hướng dẫn có thể sử dụng trên web. –

+0

Chỉ cần dán các chú thích nội dung trong câu trả lời. Hy vọng rằng sẽ giúp. –

+0

Xin lỗi, tôi hoàn toàn mới để quạ, và, thành thật mà nói, tôi thậm chí không muốn đi sâu hơn vào nó. Vì vậy, tôi không biết: 1) Tôi có phải chỉnh sửa tệp pom.xml chính hay một trong các mô-đun mong muốn (mà tôi muốn xây dựng thành gói redist), 2) Trình kích hoạt Bundle dường như là thứ gì đó liên quan đến dự án của bạn, vậy làm thế nào tôi có thể thay đổi nó để làm cho nó hoạt động? Vấn đề chính là: Tôi đang làm tất cả mọi thứ từ xa mặc dù SSH, do đó, tính linh hoạt của tôi cố gắng những thứ xung quanh là rất hạn chế. –

2

Bạn có thể có một số may mắn với số . Nếu không, hãy xem assembly plugin. Đó là linh hoạt hơn, nhưng mức độ thấp hơn. Nếu bạn đang sử dụng các plugin lắp ráp, bạn có thể tìm thấy chương trên nó trong maven: the definitive guide để có ích.

0

Tôi tin rằng Maven Shade Plugin sẽ đáp ứng nhu cầu của bạn. Tôi sử dụng nó khi tôi đang xây dựng các công cụ giao diện dòng lệnh để tạo ra một JAR Uber bao gồm các lớp học của tôi và cùng với các lớp từ tất cả các phụ thuộc của tôi.

Rất dễ sử dụng và tôi nghĩ rằng điều này example là tự giải thích.

2

Như Dominic đã nói, sử dụng plugin lắp ráp sẽ thực hiện thủ thuật. Bạn thường sẽ cấu hình nó bên POM dự án của riêng bạn để thu thập và đóng gói tất cả phụ thuộc yêu cầu:

... 
    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    </plugin> 
    ... 

jar-with-dependencies được xác định trước bởi các plugin lắp ráp và sẽ bao gồm tất cả phụ thuộc vào gói cuối cùng (xem tài liệu here).

Nếu bạn không muốn sử dụng Maven cho dự án của riêng mình, bạn sẽ cần phải sửa đổi POMs của thư viện và tự đóng gói lại chúng (tải xuống nguồn, thêm đoạn mã trên vào tệp pom.xml và chạy mvn package). Cẩn thận với các phụ thuộc tương tác trùng lặp hoặc không tương thích nếu bạn sử dụng nhiều thư viện. exclusions có thể trợ giúp trong trường hợp đó (xem tài liệu here).

0

Như một vài áp phích đã nói, plugin lắp ráp là một cách hay để tạo một tệp jar hoàn chỉnh, với tất cả các phụ thuộc của dự án. Tuy nhiên, bạn không thực sự phải sửa đổi tệp pom.xml. Chỉ cần chạy:

mvn assembly:single -DdescriptorId=jar-with-dependencies 

... để tạo tệp jar. Nếu bạn muốn làm bất cứ điều gì nâng cao hơn, bạn có lẽ nên sửa đổi pom.xml, và tạo ra một mô tả lắp ráp tùy chỉnh.

+0

'' 'assembly: single''' sẽ giải nén các JAR phụ thuộc của bạn, và điều này không thể là thứ bạn muốn. Ví dụ. các công cụ như '' 'META-INF/spring.schemas''' sẽ được ghi đè với JAR phụ thuộc Spring cuối cùng được đánh giá, và như vậy các XSD của bạn sẽ không được tìm thấy (ngoại trừ các JAR cuối cùng, dĩ nhiên). Đó là lý do tại sao các hệ thống như Alfresco đã thực hiện plugin AMP của họ bao gồm các phụ thuộc bên trong '' 'lib /' '' bên trong AMP mà bạn đang xây dựng. Tuy nhiên, điều sau đó làm nảy sinh các vấn đề quản lý phụ thuộc. – opyate

3

Sử dụng Shade plugin Maven

... nhưng hãy cẩn thận của gotchas (tương tự như một trong những mô tả tiếp tục xuống câu trả lời của tôi), trong đó đã có a workaround explained here.

Ngoài ra, hãy cẩn thận với cấu hình plugin Shade. Tôi đã vô tình sử dụng đôi thẻ <configuration> một lần và các máy biến áp không hề áp dụng và plugin cũng lấy sự tự do không cảnh báo tôi.

Không sử dụng Maven hội cắm

assembly:single sẽ giải nén lọ phụ thuộc của bạn như nó vốn có, và điều này không thể là những gì bạn muốn. Ví dụ. các công cụ như META-INF/spring.schemas sẽ được ghi đè bằng JAR phụ thuộc Spring cuối cùng được đánh giá và do đó, các XSD của bạn sẽ không được tìm thấy (ngoài những thứ trong JAR cuối cùng, tất nhiên). Đó là lý do tại sao các hệ thống như Alfresco đã thực hiện plugin AMP của họ bao gồm các phụ thuộc bên trong lib/ bên trong AMP mà bạn đang xây dựng. Tuy nhiên, điều sau đó làm nảy sinh các vấn đề quản lý phụ thuộc.

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