使用Maven原型高效创建Eclipse模块

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项目:

蚀新的Maven项目向导

图像显示的选择创建的结构与上面的命令行示例相同。 此外,它提供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项目。

翻译自: https://www.javacodegeeks.com/2014/11/efficient-creation-of-eclipse-modules-with-maven-archetype.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 编译 /usr/bin/ld: cannot find 问题解决

参考文档&#xff1a; http://www.iq38.com/38536.html linux下编译应用程序常常会出现如下错误&#xff1a; /usr/bin/ld: cannot find -lxxx 意思是编译过程找不到对应库文件。其中&#xff0c;-lxxx表示链接库文件 libxxx.so。 注&#xff1a;有时候&#xff0c;由于库文件是…

CSS知识点整理(2):框模型,定位

1. 框模型&#xff1a;Box Model 规定了元素处理元素框处理元素内容、外边距、边框、内边距的方式。 2. 当边距给定的值 可以小于4个。CSS定义了一些规则、处理这中情况&#xff1a; 如果缺少左外边距的值&#xff0c;则使用右外边距的值。如果缺少下外边距的值&#xff0c;则…

Vux的安装使用

1、Vux的安装 1.1、vue-cli的vux模板生成项目 可以直接使用 vue-cli 的模板生成一个 vux 项目 vue init airyland/vux2 projectName 由此可以直接使用 vux。&#xff08;或许运行项目可能会报错&#xff0c;那是 vue-cli 初始项目的通病&#xff09; 1.2、手动安装 vux 首先在项…

Spring Data JPA教程:获取所需的依赖关系

在创建使用Spring Data JPA的应用程序之前&#xff0c;我们需要获取所需的依赖关系。 这篇博客文章标识了必需的组件&#xff0c;并描述了如何使用Maven获得它们。 让我们开始吧。 其他阅读&#xff1a;如果您不熟悉Spring Data JPA&#xff0c;则应该阅读以下博客文章&…

元素属性的添加删除(原生js)

添加属性 odiv.setAttribute("title","hello div!");odiv.setAttribute("class","boxClass");odiv.setAttribute("hello","divTag");//自定义属性设(hello"divTag") 获取属性 var vodiv.getAttribute(&…

framelayout

编写的mail.xml文件: <?xml version"1.0" encoding"utf-8"?><FrameLayout xmlns:android"http://schemas.android.com/apk/res/android" android:id"id/frame" android:layout_width"fill_parent" android:layou…

Git 使用的问题总结

1、git stash pop 显示 xxx already exists, no checkout 当我们先使用 git stash save -u 保存信息说明 来储藏更改&#xff0c;然后拉取代码 git pull&#xff0c;如果你的本地修改有新建文件&#xff0c;远程也有新建文件&#xff0c;并且两者同名&#xff0c;此时应用储藏 …

在OpenShift上托管的WildFly实例上进行Arquillian测试

技术提示&#xff03;54解释了如何为现有Java EE项目启用Arquillian。 在该技巧中&#xff0c;测试是针对本地安装的WildFly服务器运行的。 如果此WildFly实例在OpenShift上运行&#xff0c;那么同一个适配器也可以工作吗&#xff1f; 没有&#xff01; 因为与xlocalhost相比&…

js基础---数组方法

数组数据的排序及去重   sort无形参的排序方式 arr1[2,12,3,15];var aarr1.sort();console.log(arr1);console.log(a);//排序会改变原本数组是顺序&#xff0c;是依据首个字符的大小开始排名sort有形参的排序方式方法1arr2[2,12,3,15];var barr2.sort(function(n1,n2){if(n1&…

扩展Asterisk1.8.7的CLI接口

我之前有一篇文章&#xff08;http://www.cnblogs.com/MikeZhang/archive/2012/04/14/asteriskCLIAppTest20120414.html&#xff09;介绍过如何扩展asterisk的cli接口&#xff0c;本篇是它的继续&#xff0c;总结下&#xff0c;也方便我以后查阅。 大部分情况下&#xff0c;配置…

CSS中的 ',' 、''、'+'、'~'

1、群组选择器&#xff08;,&#xff09; /* 表示既h1&#xff0c;又h2 */ h1, h2 {color: red; } 2、后代选择器&#xff08;空格&#xff09; /* 表示 h1 下面的所有 span 元素&#xff0c;不管是否以 h1 为直接父元素 */ h1 span {} 3、子元素选择器&#xff08;>&#x…

避免不必要的Spring配置组件扫描

我在堆栈溢出中遇到了一个有趣的问题。 Brett Ryan有问题&#xff0c;Spring Security配置被初始化了两次。 当我查看他的代码时&#xff0c;我发现了问题所在。 让我展示显示代码。 他有相当标准的Spring应用程序&#xff08;不使用Spring Boot&#xff09;。 使用基于Spring…

正则表达式 小结

时间&#xff1a;2018年1月21日 18:29:01 用于&#xff1a;此小结是学习正则表达式的总结 正则表达式&#xff08;regular expression&#xff09;小结1. . 表示出断行外任意一个字符   ^行首   $行尾   [] 表示范围 如&#xff1a;[a-z]指a到z范围的一个字符 [\u]表…

js 之for..in、表单及事件触发

<html ><body> <script type"text/javascript">var x;var mycarsnew Array();mycars[0] "saa";mycars[1] "Va";mycars[2] "BMW";for(x in mycars)//x是变量用来指定变量&#xff0c;指定的变量可以是数组元素&…

移动端,fixed bottom问题

//不显示 .bar {position:fixed;bottom:0;z-index:99; }//显示 .bar{position:fixed;bottom:calc(90vh); /*当前屏幕高度百分比90%*/z-index:99; } 转载于:https://www.cnblogs.com/qq917937712/p/11475310.html

js 判断一个字符在字符串中出现的次数

<script type"text/javascript">var sdjh.doiwe.esd.d.ddd0sdd.d.; var n(s.split(.)).length-1; document.write(n);</script> 结果&#xff1a;6 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

Spring Boot微服务的黑匣子测试是如此简单

当我需要进行原型设计&#xff0c;概念验证或在空闲时间使用一些新技术时&#xff0c;开始新项目对于Maven来说总是有点烦人。 不得不说&#xff0c;设置Maven项目并不难&#xff0c;您可以使用Maven原型。 但是原型通常是过时的。 谁想玩旧技术&#xff1f; 因此&#xff0c;我…

sharepoint ECMAScript对象模型系列

转载&#xff1a;Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一) http://www.cnblogs.com/wsdj-ITtech/archive/2012/06/08/2416967.html 转载于:https://www.cnblogs.com/EricLee007/archive/2012/06/08/2541636.html

c++ static关键字的作用

名称  全局静态变量  局部静态变量   静态函数  类的静态成员类的静态函数形式  全局变量前加static局部变量前加static 函数返回类型前加static类成员前加static类成员函数前加static存储区域 静态存储区 运行期间一直存在 静态存储区 运行期间一直存在 作用域…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…