2010-08-16 43 views
8

Tôi bắt đầu làm việc với Maven nhưng chưa suy nghĩ thành công về các điều khoản của Maven. Tôi có một yêu cầu cụ thể và các tài liệu được không đem lại cho tôi đủ manh mối, vì vậy tôi có thể sử dụng một chút giúp đỡ:Lắp ráp maven tùy chỉnh

Tôi muốn tạo ra một assembly mà

  1. xây dựng một jar-with-dependencies như mục tiêu "chuẩn" của tên này, nhưng loại trừ một vài tài nguyên. Tôi muốn log4j.properties và một vài tệp cấu hình khác để không phải là có trong bình.

  2. tạo tệp .ZIP chứa trong thư mục gốc của nó là .jar từ bước 1 cũng như các tệp cấu hình được đề cập ở trên.

Tôi muốn kích hoạt cụm từ này từ dòng lệnh (chỉ), do đó không cần phải liên kết với một giai đoạn (hoặc mục tiêu? Mojo?). Ưu tiên sử dụng hoặc assembly:assembly hoặc assembly:single.

  • Tôi có cần bộ mô tả lắp ráp tùy chỉnh cho điều này không?
  • Và có đúng là tôi không thể lồng nó trong pom.xml? Vì vậy, nó đi trong src/assembly/something.xml và được tham chiếu với một descriptorRef?
  • Tôi có thể viết mã này thành hai cụm tương đối đơn giản không, trong đó một bản dựng trên mặt khác (tức là cụm .Zip sử dụng assembly .Jar) hay tôi phải làm mọi thứ trong một assembly?

Trả lời

27

Tôi bắt đầu làm việc với Maven nhưng chưa suy nghĩ thành công về các điều khoản của Maven.

Chào mừng bạn lên tàu, Carl! : D

Tôi muốn kích hoạt cụm từ này từ dòng lệnh (chỉ), do đó không cần phải liên kết với một giai đoạn (hoặc mục tiêu? Mojo?). Ưu tiên sử dụng hoặc lắp ráp: lắp ráp hoặc lắp ráp: đơn.

Chỉ cần làm rõ: các build lifecycle bản thân được làm bằng phases (biên dịch, kiểm tra, đóng gói, vv) và mục tiêu plugin (về mặt kỹ thuật Mojos) đang bị ràng buộc vào giai đoạn. Sau đó, bạn hoặc gọi một giai đoạn ... hoặc chỉ một mục tiêu plugin cụ thể.

Tôi có cần bộ mô tả lắp ráp tùy chỉnh cho điều này không?

Vâng, vì bạn muốn hành vi mà pre-defined descriptors không trả lời, có. Bạn thậm chí sẽ cần hai trong số họ (cho uberjar, một cho zip).

Và có đúng là tôi không thể lồng trong tệp pom.xml không? Vì vậy, nó đi trong src/assembly/something.xml và được tham chiếu với một descriptorRef?

Có, đúng (mô tả sử dụng định dạng tùy chỉnh) và chúng thường đi vào src/main/assembly.Và không, descriptorRef là dành cho các trình mô tả tích hợp, bạn sẽ phải sử dụng descriptor tại đây.

Tôi có thể viết mã này thành hai cụm tương đối đơn giản không, trong đó một bản được xây dựng trên bộ kia (tức là cụm .Zip sử dụng cụm .Jar) hoặc tôi phải làm mọi thứ trong một assembly?

Như được đề cập, bạn sẽ cần hai bộ mô tả lắp ráp. Hãy để tôi giúp một chút ...

Giả sử bạn có cấu trúc dự án sau:

 
$ tree . 
. 
├── pom.xml 
└── src 
    ├── main 
    │   ├── assembly 
    │   │   ├── jar.xml 
    │   │   └── zip.xml 
    │   ├── java 
    │   │   └── com 
    │   │    └── stackoverflow 
    │   │     └── App.java 
    │   └── resources 
    │    └── log4j.properties 
    └── test 
     └── java 
      └── com 
       └── stackoverflow 
        └── AppTest.java 

Trường hợp pom.xml chứa các cấu hình sau cho các plugin lắp ráp:

<project> 
    ... 
    <dependencies> 
    ... 
    </dependencies> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/jar.xml</descriptor> 
      <descriptor>src/main/assembly/zip.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Các mô tả cho "uberjar" được lọc (jar.xml) trông giống như sau:

<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>uberjar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <excludes> 
     <exclude>log4j.properties</exclude> 
     </excludes> 
    </fileSet> 
    </fileSets> 
</assembly> 

gì mô tả này không có gì (trong ngắn hạn):

  • bao gồm các phụ thuộc, giải nén chúng, nhưng loại trừ bản thân dự án (vâng, đây là phản trực giác, nhưng hành vi mặc định kỳ lạ này đã được giữ cho tương thích ngược)
  • bao gồm các tệp dự án nhưng loại trừ một số tệp.

Và mô tả cho zip (zip.xml) trông như thế 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> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
    <fileSet> 
     <directory>${project.basedir}/src/main/resources</directory> 
     <outputDirectory/> 
     <includes> 
     <include>log4j.properties</include> 
     </includes> 
    </fileSet> 
    <fileSet> 
     <directory>${project.build.directory}</directory> 
     <outputDirectory/> 
     <includes> 
     <include>*-uberjar.jar</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 

Đó là (bằng cách nào đó) tự giải thích :)

  • nó bao gồm các tập tin cấu hình (tương đối đến <directory>) tại thư mục gốc của assembly
  • nó bao gồm uberjar (tương đối <directory>) ở gốc của assembly

Cuối cùng, chỉ cần chạy mvn assembly:assembly (đó là mục tiêu dự định được sử dụng trên CLI).


tôi không (cố ý) bao gồm META-INF/maven/** trong lắp ráp cho các uberjar. Có cách nào đơn giản để ngăn chặn sự bao gồm trong số này?

Chúng đến từ các thư viện được giải nén. Bạn có thể loại trừ chúng bằng cách sử dụng unpackOptions. Đây là phiên bản được sửa đổi của số jar.xml:

<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>uberjar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <unpackOptions> 
     <excludes> 
      <exclude>META-INF/maven/**</exclude> 
     </excludes> 
     </unpackOptions> 
     <useProjectArtifact>false</useProjectArtifact> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <excludes> 
     <exclude>log4j.properties</exclude> 
     </excludes> 
    </fileSet> 
    </fileSets> 
</assembly> 
+0

Salut Pascal, cảm ơn bạn * rất * rất nhiều cho câu trả lời hữu ích này! Tôi đã hy vọng bạn sẽ trả lời, tôi thậm chí đã xem xét liên hệ trực tiếp với bạn. "Trên tàu" có thể là một chút của một lời nói quá mức: Một loạt các thảm họa, dường như ngẫu nhiên, đã cản trở xây dựng của tôi kể từ khi tôi bắt đầu cố gắng để chạy nó trong Maven. Tôi vẫn cảm thấy Maven có khuôn mặt chỉ có một người mẹ có thể yêu.Nhưng trong việc tin tưởng phán xét của bạn, trong số những người khác, tôi đang tiếp tục khắc phục nó và hy vọng đạt được một điểm cao trong đường cong học tập trước khi sự kiên nhẫn của tôi phát ra;) –

+1

@Carl Tôi đã tự hỏi nếu ai đó buộc bạn sử dụng Maven, có lẽ giữ gia đình của bạn trong con tin :) nghiêm túc hơn, chúc mừng cho sáng kiến ​​và nếu tôi có thể làm cho * kinh nghiệm của bạn * tốt hơn một chút, tôi sẽ rất vui khi được giúp đỡ. –

+0

Dự đoán "con tin" gần đúng - đây là một dự án làm việc. Làm việc như một nét duyên dáng, BTW. Cảm ơn một lần nữa. Có cách nào tôi có thể ảnh hưởng đến hậu tố '-bin' trên' .zip' không? –

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