2012-04-19 24 views
9

Tôi có một ứng dụng Java trên máy tính để bàn được tạo bằng Maven 2 (nhưng tôi có thể nâng cấp lên Maven 3 nếu có ích) với một số phụ thuộc nguồn mở. Bây giờ tôi đang cố gắng để gói nó như là một độc lập để làm cho nó có sẵn cho người dùng cuối mà không cần phải cài đặt maven hoặc bất cứ điều gì khác.Làm thế nào để bạn tạo một ứng dụng độc lập với các phụ thuộc còn nguyên vẹn bằng Maven?

Tôi đã sử dụng thành công maven-assembly-plugin để xây dựng một lọ chứa tất cả các phụ thuộc nhưng đây không thực sự là điều tôi muốn vì khi sử dụng thư viện LGPL, bạn có nghĩa là phân phối lại các thư viện bạn đang dùng.

Tôi muốn Maven xây dựng một kho chứa jar với mã của tôi và MANIFEST.MF đề cập đến các lọ khác mà tôi cần cùng với các lọ khác. Điều này có vẻ như thực hành tiêu chuẩn nhưng tôi không thể nhìn thấy làm thế nào để làm điều đó.

Dưới đây là một chiết xuất từ ​​pom tôi

 <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <encoding>UTF-8</encoding> 
        <compilerVersion>1.6</compilerVersion> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <argLine>-Dfile.encoding=UTF-8</argLine> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>com.company.widget.Main</mainClass> 
          <packageName>com.company.widget</packageName> 
          <addClasspath>true</addClasspath> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <archive> 
         <manifest> 
          <mainClass>com.company.widget.Main</mainClass> 
          <packageName>com.company.widget</packageName> 
          <addClasspath>true</addClasspath> 
         </manifest> 
        </archive> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

EDIT: Taken trên Kals ý tưởng

tạo ra một tập tin gọi là descriptor.xml

<?xml version="1.0" encoding="UTF-8"?> 
<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>distribution</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <scope>runtime</scope> 
      <outputDirectory>lib</outputDirectory> 
      <unpack>false</unpack> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

và pom chứa:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <descriptors> 
      <descriptor>assembly.xml</descriptor> 
     </descriptors> 
     <archive> 
      <manifest> 
       <mainClass>com.company.widget.cmdline.Main</mainClass> 
       <packageName>com.company.widget</packageName> 
       <addClasspath>true</addClasspath> 
      </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Bây giờ duy trì bình và đặt tất cả trong thư mục lib, bao gồm mã của riêng tôi

+0

Bạn có thể phân phối ứng dụng của mình dưới dạng ứng dụng _simple_ WebStart, mà bạn không cần máy chủ ứng dụng JEE, chỉ cần một JNLP. –

+0

khmarbasise thú vị, tôi nghĩ rằng đây là giai đoạn sau khi mặc dù –

Trả lời

2

Hãy thử tạo bộ mô tả lắp ráp tùy chỉnh và thêm dependencySet và đảm bảo bạn chỉ định, giải nén là sai.

Sử dụng điều này như mô tả lắp ráp,

<?xml version="1.0" encoding="UTF-8"?> 
<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>distribution</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <scope>runtime</scope> 
      <outputDirectory>lib</outputDirectory> 
         <useProjectArtifact>false</useProjectArtifact> 
      <unpack>false</unpack> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

Lưu trữ tập tin này để nói src/main/lắp ráp/assembly.xml và cập nhật cấu hình Plugin lắp ráp của bạn trong pom.xml như thế này.

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2.1</version> 
      <executions> 
       <execution> 
        <id>assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>attached</goal> 
        </goals> 
        <configuration> 
          <descriptor>${basedir}/src/main/assembly/assembly.xml</descriptor> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Đây là lắp ráp mô tả tài liệu tham khảo nếu bạn cần bất cứ điều gì hơn

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

+0

Có vẻ tốt, nhưng xin lỗi, nơi này đi, là tập tin riêng biệt này hoặc nó đi trong pom và tôi giữ những thứ trong pom của tôi hiển thị trong câu hỏi ban đầu –

+0

Nó sẽ đi vào một tập tin riêng biệt như assembly.xml đó là bộ mô tả lắp ráp của bạn. Cấu hình plugin lắp ráp của bạn để tham khảo nó. –

+0

Xin chào, về cơ bản nó hoạt động ngoại trừ việc đặt mã của riêng tôi trong thư viện, trong khi Id chỉ kiến ​​các lọ khác nằm trong thư mục lib, bất kỳ ý tưởng nào tuyệt vời nhưng tôi đã đánh dấu câu trả lời của bạn đúng. –

1

Theo như tôi biết nó có thể phân phối lại cũng thư viện LGPL thành các gói của riêng bạn miễn là họ không bị ảnh hưởng. Plugin lắp ráp maven tạo ra một lọ chứa các jars gốc bên trong một thư mục lib của kho lưu trữ. Cho đến nay bạn đang hoàn thành LGPL.

Có thể this question cung cấp thêm một số thông tin về chủ đề này.

(Disclaimer: Tôi không phải là một luật sư, vì vậy hãy kiểm tra chéo thông tin này;))

+0

Cảm ơn, tôi đã sử dụng jar-với-phụ thuộc mà doesnt làm điều này, nhưng assembly.xml suggsted không làm điều này –

5

Bạn nên kiểm tra Maven Appassembler plugin. Bạn có thể nhận được rất nhiều gói phần mềm mạnh mẽ hơn bằng cách sử dụng nó hơn cán lắp ráp của riêng bạn.

Nó tạo tập lệnh khởi động hữu ích cho Unix và Windows cho phép bạn đặt các tùy chọn VM được xác định trước của JAVA, các tham số dòng lệnh và đường dẫn lớp.

Nó cũng có khái niệm về thư mục cấu hình nơi bạn có thể sao chép cấu hình mặc định mà sau này người dùng có thể thay đổi. Bạn cũng có thể thiết lập thư mục cấu hình để có sẵn trên classpath.

Phụ thuộc có thể được lưu theo kiểu "repo" của Maven hoặc bạn có thể sử dụng thư mục kiểu "lib" kiểu phẳng.

Bạn vẫn cần plugin lắp ráp để tạo lưu trữ zip hoặc tar.

Dưới đây là một cấu hình ví dụ appassembler:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>appassembler-maven-plugin</artifactId> 
    <version>1.2.2</version> 
    <configuration> 
     <programs> 
      <program> 
       <mainClass>com.mytools.ReportTool</mainClass> 
       <name>ReportTool</name> 
      </program> 
     </programs> 
     <assembleDirectory>${project.build.directory}/ReportTool</assembleDirectory> 
     <repositoryName>lib</repositoryName> 
     <repositoryLayout>flat</repositoryLayout> 
    </configuration> 
    <executions> 
     <execution> 
      <id>assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>assemble</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Để có được một kho lưu trữ zip tôi sử dụng lắp ráp này:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>bin</id> 
    <formats> 
     <format>zip</format> 
    </formats> 
    <fileSets> 
     <fileSet> 
      <directory>${project.build.directory}/ReportTool</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>/**</include> 
      </includes> 
     </fileSet> 
    </fileSets> 
</assembly> 
1

Thêm plugin sau trong pom.xml. Kiểm tra giá trị tại các thẻ mainClass, classpathPrefix, addClasspath.

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>org.apache.camel.spring.Main</mainClass> 
         <classpathPrefix>lib/</classpathPrefix> 
         <addClasspath>true</addClasspath> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <descriptors> 
        <descriptor>src/assembly/some-assembly.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

Tạo một số assembly.xml trong src/assembly như dưới đây.

<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
<id>distribution</id> 
<formats> 
    <format>zip</format> 
</formats> 
<includeBaseDirectory>true</includeBaseDirectory> 
<fileSets> 
    <fileSet> 
     <directory>${project.build.directory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
      <include>*.jar</include> 
     </includes> 
    </fileSet> 
</fileSets> 
<dependencySets> 
    <dependencySet> 
     <scope>runtime</scope> 
     <outputDirectory>/lib</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
     <unpack>false</unpack> 
    </dependencySet> 
</dependencySets> 

Lưu ý rằng useProjectArtifact cờ sai, cờ giải nén thành false. Nếu thư mục gốc bên trong tệp zip là không cần thiết, sau đó người ta có thể làm cho includeBaseDirectory thành false.

Điều này sẽ tạo tệp name-version-distribution.zip. Bên trong tệp zip, sẽ có phiên bản tên thư mục. Bên trong thư mục này, thư mục jar và thư mục lib thực thi của bạn có chứa tất cả các jars phụ thuộc sẽ có mặt. Kiểm tra tệp manifest.MF của jar thực thi. Nó chứa cả thông tin lớp chính và classpath.

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