2011-08-28 35 views
17

Tôi đang tạo một nguyên mẫu Maven tạo bộ khung dự án sẽ bao gồm sự phụ thuộc vào dự án mà từ đó nguyên mẫu có nguồn gốc.Làm thế nào để nhúng phiên bản dự án nguyên mẫu trong nguyên mẫu Maven?

Ví dụ, dự án có nguồn gốc trông giống như:

origin/archetype/... archetype for generating project 
     /core/... core services 
     /extra/... extra services 

và nguyên mẫu sẽ tạo ra một dự án với một POM chứa phụ thuộc như vậy:

<dependencies> 
    <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
    </dependency> 
</dependencies> 

Tôi muốn SOMEVERSION là phiên bản của dự án gốc tại thời điểm rằng nguyên mẫu được xây dựng và cài đặt vào kho lưu trữ.

Vì vậy, nếu dự án gốc ở phiên bản 1.0-SNAPSHOT và là mvn install thì tôi muốn nguyên mẫu tạo phụ thuộc vào origin-core 1.0-SNAPSHOT. Và khi dự án gốc được phát hành và tự động gặp phải phiên bản 1.0, tôi muốn nguyên mẫu tạo phụ thuộc vào origin-core 1.0.

Về cơ bản, tôi muốn sử dụng ${archetypeVersion} làm biến Velocity trong nguyên mẫu POM, nhưng điều đó dường như không thể.

Có cách nào khác để hoàn thành những gì tôi đang cố gắng làm ở đây không?

Trả lời

32

Tôi đã hỏi câu hỏi trên trên danh sách gửi thư của Maven cách đây vài ngày và bị tumbleweeds. May mắn thay, cuối cùng tôi đã tự tìm ra nó. Dưới đây là ít nhất một cách lành mạnh để thực hiện việc này:

Sử dụng lọc Maven trên tệp src/main/resources/archetype-resources/pom.xml để thay thế trong phiên bản dự án hiện tại khi tạo kiểu mẫu.

Dưới đây là làm thế nào mà hoàn thành công việc:

Sửa đổi tập tin archetype/pom.xml của bạn để kích hoạt tính năng lọc vào file archetype-resources/pom.xml chứ không phải bất cứ thứ gì (vì file nguyên mẫu của bạn một cách tự nhiên sẽ có ${variable} là ở khắp mọi nơi và bạn không muốn những được thay thế tại thời gian xây dựng, bạn muốn chúng được thay thế khi nguyên mẫu được tạo).

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>archetype-resources/pom.xml</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>archetype-resources/pom.xml</exclude> 
    </excludes> 
    </resource> 
</resources> 

Enable một ký tự thoát để sử dụng khi lọc, do đó bạn có thể thoát khỏi tất cả các biến trong pom nguyên mẫu của mình rằng cần phải duy trì như-là để họ có thể được thay thế vào thời điểm thế hệ archetype:

<pluginManagement> 
    <plugins> 
    ... 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
     <escapeString>\</escapeString> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 

(Lưu ý các yếu tố <resources><pluginManagement> được hiển thị ở trên phải được đặt bên trong phần tử <build> của POM của bạn.)

Sử dụng ${project.version} trong pom nguyên mẫu của bạn, nơi bạn muốn phiên bản của dự án nguyên mẫu của bạn sẽ được chèn vào, và thoát khỏi tất cả các biến khác mà nên vẫn không thế cho đến khi thời gian thế hệ archetype:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>\${groupId}</groupId> 
    <artifactId>\${artifactId}</artifactId> 
    <version>\${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

Chính xác những gì tôi cần. Cảm ơn rất nhiều. –

+0

Hoạt động như một sự quyến rũ! Cảm ơn. – Malvin

+0

Điều này thật ngọt ngào, tuyệt vời. – ocarlsen

12

Một thay thế giải pháp cho câu trả lời được chấp nhận là để lọc thuộc tính mặc định trong file archetype's descriptor/metadata

này được thực hiện như sau:

các maven lọc chỉ lọc tập tin này:

<resources> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/maven/archetype-metadata.xml</include> 
    </includes> 
</resource> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>META-INF/maven/archetype-metadata.xml</exclude> 
    </excludes> 
</resource> 
</resources> 

Các nguyên mẫu meta tập tin dữ liệu:

<archetype-descriptor ...> 
    <requiredProperties> 
     <requiredProperty key="projectVersion"> 
      <defaultValue>${project.version}</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

    ... 
</archetype-descriptor> 

và POM của nguyên mẫu sẽ tương tự trước ngoại trừ việc nó sẽ sử dụng projectVersion giá trị tài sản cần thiết như các phiên bản dự án:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${projectVersion}</version> 
    </dependency> 
    </dependencies> 

</project> 

Cách tiếp cận này có lợi thế là nó tránh phải thoát khỏi tất cả các giá trị thuộc tính trong POM của nguyên mẫu và cấu hình plugin tài nguyên đi kèm với nó . Cá nhân, tôi tìm thấy tất cả những điều khá xấu xí và dễ bị lỗi.

Điều đó có nghĩa là người dùng được yêu cầu xác nhận hoặc thay đổi phiên bản dự án khi tạo kiểu mẫu. Tùy thuộc vào kịch bản, tôi đoán điều này có thể được coi là một điều tốt hay xấu.

+0

Giải pháp này chắc chắn tốt hơn so với giải pháp được chấp nhận. Cảm ơn bạn rất nhiều vì điều này. Nó tiết kiệm rất nhiều thời gian của tôi –

-1

Tôi đã thử một cái gì đó khá ngu ngốc và có vẻ như nó đã hoạt động. Tôi đã thêm dòng sau vào file META-INF/maven/nguyên mẫu-metadata.xml tôi:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

Bạn sẽ nghĩ rằng nó sẽ biết về nó theo mặc định nhưng nó không nên điều này dường như để nhắc nhở nó để sử dụng nó . Có lẽ nó là do một lỗi trong maven.

+0

Nó không hoạt động nếu bạn sử dụng chế độ tương tác và bạn phải lọc tài nguyên kiểm tra nguyên mẫu. Tùy chọn bạn có thể dựa vào câu trả lời @PhilMander để thực hiện công việc. – LoganMzz

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