Shabunk,正如我所评论的那样,Maven正在推动你以最佳方式做你想做的事,从多年的开发经验中继承下来。
我会解释我会做什么(以及我自己真的)。
所以你有权使用Maven插件版,再加上另外一个(货物为例) 你试图做两型动物的事情:
- 标识独特的版本,这意味着它标记,和更新POM新版本
- 部署您的应用程序(无论哪个环境在它是)
Maven发布插件
考虑一下,你自己的过程也许比其他开发团队习惯的更为严格。我的意思是在大型团队中单元测试和生产部署之间有更多步骤(Q & A,用户接受度,非回归活动)。看起来你制作了一个链接标签和生产部署的快捷方式。 如果你想在不同的环境中部署你的web应用(集成,用户接受,性能,preprod等),你必须确定你的版本,并且必须能够重新构建它(当然和“可重复”)。
这是maven-release-plugin的意图。它可以帮助您验证源代码是否干净(所有源代码管理下的文件,无需修改),可以编译并通过所有测试阶段。然后,它会处理pom版本和标记,并将其存储起来,以便稍后在您的Maven企业存储库中使用。
你有很多配置可以设置(ditributionManagement,SCM,maven插件发布配置)。但是,一旦它在的地方,释放版本站在一个简单的命令行:
mvn release:prepare release:perform
如果你想要一些例子,我可以给你一些。
<scm>
<!-- Base URL repository -->
<url>scm:svn:http://svn.myorg.corp/svn/repository/</url>
<!-- Developper URL (from trunk or branche) -->
<developerConnection>scm:svn:http://svn.myorg.corp/svn/repository/trunk/project1</developerConnection>
<connection>scm:svn:http://svn.myorg.corp/svn/repository/trunk/project1</connection>
</scm>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<version>1.6</version>
<configuration>
<username>${from.settings.xml.user}</username>
<password>${from.settings.xml.password}</password>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.2.2</version>
<configuration>
<tagBase>http://svn.myorg.corp/svn/repository/tags/</tagBase>
<scmCommentPrefix>[DEV#SCM]</scmCommentPrefix>
</configuration>
</plugin>
</plugins>
[...]
</build>
<distributionManagement>
<repository>
<id>enterprise_repo</id>
<name>Enteprise Repository on Artifactory - Stable versions</name> <url>http://repo.corp:8080/artifactory/prj-xxx-releases</url>
</repository>
<snapshotRepository>
<id>enterprise_repo</id>
<name>Enteprise Repository on Artifactory - DEV versions</name>
<url>http://repo.corp:8080/artifactory/prj-xxx-snapshots</url>
</snapshotRepository>
<site>
<id>corporate_site</id>
<name>Corporate public site</name>
<!-- must add wagon plugin that support this protocol -->
<url>ftp://...</url>
</site>
</distributionManagement>
Deployement
再次,你可能对你想测试你对应用程序的多个environnements。 有很多插件可以让你发送和部署你的战争:一般的货物插件,或更具体的tomcat插件,glassfish插件,...插件让你做你想做的事。然后,可以以多种方式执行配置。
完整的Maven方式: 与Maven的完整集成方式是使用Profile和可能的过滤器。如你所知,档案让你描述合适的人和行为。过滤器是一种.properties,它将一组变量分组,用于将xml配置文件中的模式替换为war(例如db连接)。这不是我使用的,因为我觉得它比文件外化更不灵活。但无论如何,我更喜欢使用Maven和Jenkins(或连续集成工具)构建我的应用程序。这就是为什么我同意亚伦时他说你必须知道你的工具的局限性。使用Jenkins,我每天/每天运行我的应用程序,以应对单元测试,生成Q &报告,文档...我有一个发布版本,可以帮助我生成我想要交付的所有内容(给我的测试团队或我的客户),并提供一些信息给我的工作部署到不同的环境(使用maven配置文件或jenkins内置配置)。
它对我来说真的很好,我很确定这是正确的做法。
[编辑]
部署
再次,部署意味着生命周期的不同阶段。
本地/开发环境在
我从来没有使用Tomcat:部署到现在为止,但仅仅是因为我更喜欢使用码头轻Web容器(和良好使用Maven集成)。但是我很确定,每一个配置都会适合你的需求。
持续集成环境公司 在持续集成环境在,我通常是战争直接与詹金斯(出口*所需的机器上的.war)复制。我这样做的方式取决于许多因素:
- 如果CI软是相同的(物理|虚拟)服务器上比你的应用服务器(Tomcat的,JBoss和Weblogic的,Glassfish的,...),或者遥远一个=>拷贝时间能够脱颖而出服务器更新时间,并会产生不安全deployement(通常损坏档案)
- 如果服务器是支持热重载(在web的应用程序为Tomcat分解战争),或至少知道文件系统的修改(全战/部署的JBoss)
- ,如果你需要之前停止服务器,...
大多数的时间,这是一个简单的复制。如果我不能,我使用一些集成的Maven插件(如jahia:部署插件用于着名的CMS:www.jahia.com),或者仅使用货物插件:http://cargo.codehaus.org/Maven2+plugin。我没有任何例子,但在互联网上很容易找到一些例子,因为这种配置通常会被推荐。
Q & A /承兑/生产环境在
对于那种environnements,往往(据我,因为我在我的工作所看到的)与服务级别协议的交易,我们(我和管理团队)写了一些特定的脚本。我相信你会失望,但正如我所说的,我不依赖于Maven的一切,特别是部署。恕我直言,这是这个工具的一个限制。你可以依靠货物插件或者特定的插件,但是发布一个版本,或者建立一个版本不符合(按时间顺序)真正的部署。更重要的是,我没有发现任何让我轻松部署多个实例的插件......甚至值得您必须以特定顺序关闭实例(SLA的需求)。这就是说,我没有提到外部属性或SQL脚本或其他任何东西。他们是依赖专用工具的其他理由。
所以,通常,我们编写了自己的蚂蚁/卖出脚本。如果其他人有更好的解决方案,我显然是有兴趣的!
我希望我已经够清楚了。
问候。
配置文件以哪种方式支持您在git仓库中添加标签并递增构建版本? Maven就像一把锤子一样的工具 - 它不适合每一项任务。 – 2012-06-08 19:10:43
你的基本前提错了。 – 2012-06-09 13:36:33
我完全同意你的看法。 Maven是我认识的推动开发生命周期的最佳实践的更好工具之一。如果你没有使用它,那很可能是因为你不正确(关于最佳实践)。所以你必须委托给其他工具,通常是Ant,Jenkis或其他工具。对于传统项目来说这很困难,通常是不可能的,但它代表正确的方式来做到这一点...... +1! – 2012-06-09 20:15:32