我將創建一個多模塊原型。它會生成幾個模塊。原型的一些用戶可能需要所有這些,而有些只需要其中的一些。多模塊maven原型可以設置爲可選模塊嗎?
我的原型可以從命令行獲取參數並決定生成哪些模塊?我檢查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html,它似乎不支持。
我將創建一個多模塊原型。它會生成幾個模塊。原型的一些用戶可能需要所有這些,而有些只需要其中的一些。多模塊maven原型可以設置爲可選模塊嗎?
我的原型可以從命令行獲取參數並決定生成哪些模塊?我檢查了https://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html,它似乎不支持。
我已分叉項目並添加了一項功能,以啓用或禁用基於傳遞給Maven會話的屬性生成子模塊。
請參閱https://github.com/manouti/maven-archetype。
當調用create-from-project
目標時,通過設置-DgenerateEnableProperties=true
,該插件將以generate.module.X
的形式爲每個子模塊創建啓用器屬性。之後在調用generate
目標時,可以通過傳遞-Dgenerate.module.X=false
來排除模塊。
或者:
您可能能夠通過在描述符,這允許在現有項目的頂部上的項目的產生設定partial="true"
來解決此使用部分原型。 This post似乎解決了同樣的問題。
然後,您可以編寫一個腳本,該腳本採用所需的屬性並使用部分原型生成項目的相應部分,例如,使用Ant:
<target name="mvn.generate.project.module1" if="generate.module1">
<exec dir="." executable="sh">
<arg value="-c" />
<arg value="mvn archetype:generate -DarchetypeGroupId="com.example.project" -DarchetypeArtifactId="archetype1" ..." />
</exec>
</target>
<target name="mvn.generate.project.module2" if="generate.module2">
<exec dir="." executable="sh">
<arg value="-c" />
<arg value="mvn archetype:generate -DarchetypeGroupId="com.example.project" -DarchetypeArtifactId="archetype2" ..." />
</exec>
</target>
更新(16年6月11日):
一個相關的問題是https://issues.apache.org/jira/browse/ARCHETYPE-494。從提交者的描述:
在那裏你可以指定一個groovy文件,它將在原型生成後執行。我個人使用這個groovy文件做類似的事情:我從命令行讀取屬性,然後刪除用戶可能不需要的聲明的依賴項,類和jsp文件。
在這種特定的情況下,原型總是可以創建所需的所有模塊和移動不同口味(模塊組)成型材。默認情況下,只有一個配置文件在archetype:generate
步驟中處於激活狀態。
因此,如果我想有一組模塊用於flavorA,我將運行原型爲
mvn archetype:generate -DarchetypeGroupId=.. -DflavorA=true
而且原型將這個變量傳遞給flavorA輪廓重的activeByDefault
元素 - 爲flavorA用戶所需的一組模塊定義modules
元素。
同樣可以完成對flavorB和flavorB(例如),每一個都限定一組不同的模塊。
這樣的聚合器/父POM作爲原型的一部分的一個例子是:
<profiles>
<profile>
<id>flavourA</id>
<activation>
<activeByDefault>${flavourA}</activeByDefault>
</activation>
<modules>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourB</id>
<activation>
<activeByDefault>${flavourB}</activeByDefault>
</activation>
<modules>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourC</id>
<activation>
<activeByDefault>${flavourC}</activeByDefault>
</activation>
<modules>
<module>profiles-module1</module>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
</profiles>
的archetype-metadata.xml
文件然後可以指定:
<requiredProperties>
<requiredProperty key="flavourA">
<defaultValue>false</defaultValue>
</requiredProperty>
<requiredProperty key="flavourB">
<defaultValue>false</defaultValue>
</requiredProperty>
<requiredProperty key="flavourC">
<defaultValue>false</defaultValue>
</requiredProperty>
</requiredProperties>
並與-DflavorB=true
調用的原型選項會生成一個pom,如下所示:
<profiles>
<profile>
<id>flavourA</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<modules>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourB</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<modules>
<module>profiled-module3</module>
</modules>
</profile>
<profile>
<id>flavourC</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<modules>
<module>profiles-module1</module>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
</profile>
</profiles>
這種方法具有以下優點和缺點:
優勢
缺點
此外,在噸的頂他的方法如上所述,我們也可以在每個配置文件中配置Maven Clean Plugin,以刪除不受其風格影響的模塊,以便在其第一個版本(maven clean
)中刪除任何不需要的模塊。儘管如此,這種方法會使POM的分佈不一致,但也可以考慮(不推薦)。
喜歡的東西:
<profile>
<id>flavourA</id>
<activation>
<activeByDefault>${flavorA}</activeByDefault>
</activation>
<modules>
<module>profiled-module2</module>
<module>profiled-module3</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/profiled-module1</directory>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
</profile>
我想你問的是這個問題的背景:
https://issues.apache.org/jira/browse/ARCHETYPE-494
我有它已經實施和將被納入下一版本的maven原型插件。在那裏你可以指定一個groovy文件,它將在原型生成之後執行。我個人使用這個groovy文件做類似的事情:我從命令行讀取屬性,然後刪除用戶可能不需要的聲明的依賴項,類和jsp文件。
請讓我知道,如果有幫助。
與此問題相關:https://issues.apache.org/jira/browse/ARCHETYPE-274 –
另請參閱https://issues.apache.org/jira/browse/ARCHETYPE-494。 – manouti