Maven Archetype是一个项目模板工具包,可为开发人员提供生成内置或自定义脚手架工件的参数化版本的方法。 最近,我将其应用于我们的Xiliary P2存储库,以实现Eclipse模块存根创建的自动化。
由于效果很好,所以我认为值得在这篇文章中分享我的经验。
Maven原型
Maven Archetype使程序员可以根据项目或组织规定的惯例和最佳实践快速并一致地设置脚手架。 它带有一组预定义的模板,以简化常用结构的生成。
有关Maven提供的默认原型的列表,请参阅“原型简介”部分中的“ 提供的原型” 。
例如,可以基于原型maven-archetype-webapp生成Web应用程序项目存根:
mvn archetype:generate \
-DgroupId=com.codeaffine \
-DartifactId=com.codeaffine.webapp \
-Dversion=1.0-SNAPSHOT \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DarchetypeVersion=1.0 \
-DinteractiveMode=false
参数groupId,artifactId和version用于创建包含适当配置的项目对象模型定义( pom.xml
)的项目根文件夹。 而archetypeXXX
参数指定要使用的模板。 基于Web应用程序原型,Maven提供了一个pom,可将构建生命周期 packaging
属性设置为war
并生成以下目录和文件结构:
com.codeaffine.webapp
|-- pom.xml
`-- src
`-- main
|-- resources
`-- webapp
|-- WEB-INF
| `-- web.xml
`-- index.jsp
如果您碰巧使用Eclipse的Maven集成,则可以为Maven项目选择“ 新建项目”向导 ,以生成派生自特定原型的Eclipse项目:
图像显示的选择创建的结构与上面的命令行示例相同。 此外,它提供Eclipse项目特定的文件和设置,并将生成的项目自动导入IDE的工作区中。
自定义原型创建
尽管预定义的模板可以快速入门,但显然不足以采用项目或组织特定的约定。 例如,Eclipse IDE允许在生成的支架结构内的文件中配置所有类型的设置。 因此,将这样的预设包括在定制原型中将是有帮助的。
幸运的是,Maven原型可以方便地创建自定义模板定义,如在线文档《创建原型指南》中所述。 但是,我发现从头开始建立原型比使用Dirk Reinemann所描述的create-from-project选项更为有效。
之所以能够做到这一点,是因为我已经有了一些可以用作原型的Eclipse插件,片段和功能。
我在GitHub上找到了tycho-eclipse-plugin-archetype定义,该定义提供了一个模板,用于一步生成带有测试片段和存储库站点的eclipse模块,这似乎为eclipse插件开发提供了一个很好的快速入门 。
从专案建立
要从给定的项目中创建Maven原型,请将其复制到工作目录中,并删除所有不应包含在原型包中的文件。 现在,此项目躯干提供了构成支架的所有文件和目录结构。
确保躯干的根文件夹还包含一个简单的 pom.xml
如创建原型指南中的第一步所述。 之后,导航到pom所在的文件夹并执行以下命令:
mvn archetype:create-from-project
这将生成存储在子文件夹target/generated-sources/archetype
的原型开发结构。 它包含一个新原型的pom,该原型源自放置在项目躯干根文件夹中的pom。 此外,还有一个子路径src/main/resources/archetype-resources
,其中包含脚手架结构和资源的副本。
src/main/resources/META-INF/maven/archetype-metadata.xml
是ArchetypeDescriptor ,它列出了将包含在新创建的模板中的所有文件并对它们进行分类,因此可以通过生成机制对其进行正确处理。
现在可以打包原型,并首先尝试看看它是否按预期工作。 为此,导航到原型的pom所在的文件夹并运行:
mvn install
这样可以使原型在本地存储库中可用。 第一次使用它就像上面的Web应用程序示例中一样容易,并且看起来应该类似于以下代码片段:
mvn archetype:generate \
-DarchetypeArtifactId=foo.artefactId \
-DarchetypeGroupId=foo.groupId \
-DarchetypeVersion=foo.version
如果做得正确,Maven现在应该已经创建了一个项目存根,该存根与项目躯干中的对象基本相同。
调整项
不幸的是,还有更多的工作要做。 Eclipse插件,片段和功能部件提供了自己的元描述符,其中包含标识符,版本号,名称等。 当然,我们希望模板处理器合理地填充这些值。
Maven原型使用可以在ArchetypeDescriptor中声明的属性来处理此问题(请参见上文)。
<requiredProperties>
<requiredProperty key="identifier"></requiredProperty>
</requiredProperties>
现在,您可以使用以下语法在原型的任意资源中引用此属性:
[...]
Bundle-SymbolicName: ${identifier}
[...]
可以通过将属性设置为命令行的系统参数来完成属性的初始化,例如:
mvn archetype:generate \
-DarchetypeArtifactId=foo.artefactId \
-DarchetypeGroupId=foo.groupId \
-DarchetypeVersion=foo.version \
-Didentifier=foo.identifier \
插件和片段的另一个问题是例如.project
定义文件引用的空或不存在的源文件夹。 Maven在模板处理期间会忽略空目录。 但是以下代码段显示了如何配置描述符以创建此类文件夹:
<fileSets>
<fileSet filtered="true" encoding="UTF-8">
<directory>src</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
[...]
有关描述符配置的更多详细信息,请参考在线文档 。
组装件
有了这些知识,我就可以为与Xiliary开发预设匹配的插件,测试片段和功能定义存根创建Maven原型工件。 这意味着每个存根都具有开箱即用的代码格式,执行环境,编译错误/警告首选项等特定设置。
出于灵活性的考虑,我决定使用三个单独的人工制品,而不是一个,并使用一个小脚本将它们连接在一起。 这是因为大多数时候我需要一步创建所有三个存根。 尽管这使Eclipse New Project向导无法使用,但这并不是什么大问题,因为唯一的好处就是自动存根的工作区导入。
剩下的唯一手动任务是在存储库的构建定义的父pom中注册新模块,以及在P2相关的catagory.xml
添加新功能条目。
结论
这篇文章简要介绍了Maven Archetype,并展示了如何将其用于自动化Eclipse模块创建。 使用上述自定义原型后,现在大约需要一分钟的时间将带有插件和测试片段的新功能定义添加到工作区并生成定义。
与之前的手动创建,配置,复制和粘贴连载内容相比,在一分钟内完成开发和构建还不错……因此,您想自己看看原型源,定义位于com.codeaffine.xiliary.archetype
GitHub上Xiliary储存库的com.codeaffine.xiliary.archetype
项目。