1

如何配置 maven 以支持这种类型的工作流:

一次性设置调用 maven 对开发人员机器进行一次性设置,例如

  1. 创建为此应用程序配置的自定义版本的 tomcat
  2. 在开发人员机器上创建本地 postgres 数据库
  3. 将样本数据加载到数据库中
  4. 运行 junit 测试以配置运行应用程序所需的其他资源

集成测试调用 maven 来运行集成测试,它应该执行以下操作

  1. 创建集成测试数据库
  2. 设置数据库
  3. 针对数据库运行命令行集成测试
  4. 运行包含应用程序的测试版 tomcat
  5. 运行命令行 junit 测试,测试应用程序公开的 RESTful 服务

Release Build调用 maven 对系统进行发布构建

  1. 完成集成测试的所有步骤
  2. 生成用于服务器而非生产的资源和配置
  3. 将最终结果存放在 git repo 中,提交并将更改推送到生产环境

测试构建调用 maven 对系统进行测试构建

  1. 执行发布构建的所有步骤,但使用测试服务器配置配置测试发布包

我正在努力解决的主要问题是 maven 有一个单一的构建生命周期,其中包含明确定义的阶段序列,不确定我要构建的工作流是否适合 maven。

可以为这种类型的工作流配置 maven 吗?如果是的话,maven 的主要功能是什么,允许我想使用 maven 的四种主要方式的不同配置?

更新我所说的这个工作流程的意思是,我希望能够做类似的事情

mvn setup 
mvn integration 
mvn prod-release
mvn test-release 

我知道上面的例子看起来像蚂蚁,我是长期的蚂蚁用户和 maven 的总菜鸟。

4

1 回答 1

2

你可以设置 Maven 来做这一切......

您可能会使用(震惊恐怖)配置文件来实现其中的一些......

但你不想那样做

您正在遵循 ANT 风格的思维......如果您喜欢这种思维方式,那么使用 ANT 或 Gradle 并感到高兴。

如果您想遵循 Maven 方式,那么您将以不同的方式解决问题。

来自Maven的方式,这是我的想法:

  1. 为什么需要一次性设置?我通常有一个run配置文件,它可以动态配置正确的应用程序服务器,并在部署应用程序的情况下启动它,然后在我点击^C. 通常这涉及启动一两个数据库服务器......因此我开发的东西就像cassandra-maven-plugin。这样,当我在处理不同的项目时(可能需要 10 分钟的时间),我不必担心后台数据库服务器会占用我所有笔记本电脑的内存。

  2. 当您进行上述工作时,集成测试实际上是微不足道的......事实上,我创建了Maven Failsafe 插件,以便轻松地将插件执行绑定到集成测试的适当阶段。Maven 约定是有一个run-its用于运行集成测试的配置文件。

  3. 发布版本与测试版本不同......呃!您应该构建与环境无关的工件。让他们从他们部署的环境中获取他们的配置。这消除了“测试”构建和“生产”构建之间发生变化的担忧。如果你真的需要捆绑配置,那么我通常会求助于一个单独的模块来获取不可知的工件并重新捆绑所需的配置。这样就很容易证明你有一个可重复的转换,并且在 QA 和 Ops 之间没有任何变化。

  4. 我总是让发布版本包含集成测试。

所以通常我的项目是这样的

$ mvn -Prun

将从零开始启动应用程序。点击 ^C 将再次删除所有内容,mvn clean或者在极端情况下,如果我有一个更复杂的设置过程并且需要一些缓存mvn post-clean(想想真的很干净)将删除run配置文件投入使用的任何内容

要运行我通常做的集成测试

$ mvn -Prun-its verify

要发布,我通常会这样做

$ mvn release:prepare release:perform -B

这是(在我看来)处理您需要的上述步骤的理想方式。

HTH。

顺便说一句,我不必专门使用 PostgreSQL(通常我的集成测试和run配置文件可以使用纯 java 数据库,例如derbyhsqldb,并且由于工件与环境无关,因此很容易让集成测试/开发 flyweight 应用程序服务器注入正确的 JDBC url) 所以你可能会遇到一些关于 PostgreSQL 的问题

于 2012-11-10T14:06:18.210 回答