6

我在一个小团队(3 人)的几个模块(目前大约 10 个)上工作。构建版本的编译、集成和管理变得越来越繁琐。我正在寻找一个好的构建/集成工具来替换/完成 Ant。

以下是我们当前开发环境的描述: - 几个模块依赖于第三方 JAR - 一些可能导出 JARS,一些导出 WARS,一些导出独立、可运行的 JARS(使用 Fat-Jar) - 所有这些的 Javadoc - 我们使用 eclipse - 每个模块的自定义 Ant 脚本。eclipse 配置和 Ant 脚本之间有很多冗余信息。例如,对于独立的 Fat-JAR,我们列出了所有递归依赖项,而理想情况下,它可以清楚地从 eclipse 配置中导入。- 源代码使用 SVN 进行版本控制

这是我想要一个完美的集成工具为我做的事情:

  • 自动化模块的发布和版本控制。理想情况下,集成工具应该检测是否需要新版本。比如我要发布一个依赖于项目B的项目A,如果我在本地对项目B做了一些小改动,那么集成工具应该先发布一个新版本的B,并在A的基础上做它。

  • 与 eclipse 强集成,使其可以从其配置中获取模块和第三方库之间的依赖关系。顺便说一句,我想继续使用 eclipse 配置构建路径而不更新其他一些“.xml”内容。我看到 Gradle 可以从它的配置中生成 eclipse 项目文件,但是对应的会很棒。

  • 在本地项目上实现“实时”和透明的开发。我的意思是,在开发主要/“叶”项目时,我经常对核心/通用项目进行小改动。我希望我对核心项目的更改可以立即用于叶子项目,而无需发布(甚至在本地)我的核心项目的 JAR。

  • 将我的模块版本的所有版本存储在外部服务器上。最简单的(共享文件夹/Webdav)将是最好的。一个带有模块列表和交付工件的漂亮网页也会很棒。

我环顾四周寻找了很多东西。从 Ant4eclipse(将 Eclipse 配置集成到我的 Ant 脚本中)到 Maven / Ivy / Gradle 工具。

我有点困惑。到目前为止,这是我所了解的: - Maven 是一个很棒/很大的工具,但有些僵化,迫使您屈服于它的结构和概念。它基于描述而不是脚本。如果你走出这条路,你必须开发自己的插件。- Ivy 不如 maven 强大,它处理的东西更少,但更灵活。- Gradle 介于两者之间。它是通用的。它支持脚本以及“基于约定”的配置。它集成了 Ant 并对其进行了扩展。

所以在这一点上,我正在寻找来自真实用户的实际推荐。你用什么工具?如何 ?你有和我一样的需求吗?它是让你的生活变得轻松还是妨碍你?

是否有一些示例用例或工作区框架可供我用作起点来了解这些工具的功能?

很抱歉这条消息的长度。并提前感谢您的建议。

亲切的问候,

拉斐尔

4

6 回答 6

2

自动化模块的发布和版本控制 (...)

版本控制和存储库的概念是 Maven 内置的,它们可以适合这里。

Maven 支持SNAPSHOT 依赖项。使用快照时,Maven 会在您运行构建时定期尝试从存储库下载最新的可用快照。SNAPSHOT 通常在项目处于积极开发阶段时使用。

Maven 2 还支持版本范围(我并不真正推荐它们,但这是另一回事),例如允许将 A 配置为依赖于[4.0,)B 的版本(任何大于或等于 4.0 的版本)。如果您构建并发布 B 的新版本,A 将使用它。

与eclipse强集成

m2eclipse插件提供与 Eclipse的双向同步。

在本地项目上实现“实时”和透明的开发。

m2eclipse 插件支持“工作区解析”:如果项目 A 依赖于项目 B 并且如果项目 B 在工作区中,则可以将 A 配置为依赖 B 源而不是 B.jar(如果我不是,这是默认模式错误的)。因此,对 B 源的更改将直接可见,无需构建 B.jar。

将我的模块版本的所有版本存储在外部服务器上。

如前所述,这实际上是 Maven 的核心概念(您甚至没有选择权),并且通过 file:// 或 dav:// 进行部署都支持。


总而言之,Maven(可能)不是唯一的候选人,但我相信它会适合:

  • 你的项目不是那么奇特或复杂,你的描述没有什么可怕的(可能需要对结构进行一些重构,但这应该没什么大不了的)。
  • Maven 还带来了基于最佳实践的工作流程。
  • m2eclipse 提供与 IDE 的强大集成。

但是 Maven 有一些学习曲线。

于 2010-07-06T13:59:16.400 回答
2

我们已经开始将 Gradle 集成到我们的构建过程中,我可以在已经发布的答案中添加 Gradle 也可以工作。您的假设大部分是正确的,gradle 更方便,但功能强大并且允许在构建本身中编写脚本等。似乎maven可以做的大多数事情,gradle也可以。

现在为您的个人观点:

版本控制:gradle 支持依赖映射、版本控制,如果你添加一个 CI 服务器,你可以触发自动化/依赖构建。例如,几乎我们所有的“可交付成果”都是 .wars,但我们有几个代码库 (.jars) 和一个正在开发的可执行 .jar。一种配置是使战争和“fat-jar”依赖于共享代码库。然后,当共享库更新时,更新共享库上的版本,测试正在使用的项目,然后使用 Hudson 启动依赖项目的能力来重新部署这些项目。还有其他方法,但目前这似乎对我们最有效。

与 eclipse 强集成:没错,gradle 可以生成 eclipse 文件。一旦我们开始,我们倾向于只使用 eclipseCp(更新 .classpath)任务,因为只有类路径需要改变。它有点古怪(获取您的默认 JRE,因此请确保它是正确的,如果您需要它,不要添加 export="true"),但可以让您完成 99% 的工作。

在本地项目上启用“实时”和透明的开发:这是我不确定的。在这种情况下,我只破解了 gradle ;通过删除消费项目中的工件并在 Eclipse 中将共享项目标记为这样,然后恢复。

将我的模块的所有版本存储在外部服务器上:支持简单且多种方法,类似于 Maven。

就示例而言,gradle 的文档以及完整 zip 附带的示例项目都很好。他们会让你快速启动并运行。

于 2010-07-06T16:59:31.267 回答
2

持续集成工具?对我来说,只有一个:Hudson CI


我曾经为 Java 设置了一个软件开发环境,其中包含以下组件:

  • 日食IDE
  • 善变的
  • 虫虫
  • 行家
  • 关系
  • 哈德逊 CI

和一些 apache, mysql, php, perl, python, .. 用于集成。

hudson 没有与 eclipse 集成,这是故意的,因为我想在单独的服务器上构建。对于所有其他工具,我有一个完美的交叉集成(例如:mylyn on eclipse 与 bugzilla 交谈,m2eclipse 用于使用 maven eclipse,很多插件用于 hudson,...)

于 2010-07-06T13:17:37.267 回答
1

没有灵丹妙药,但根据我的经验,Maven 是一个很棒的项目管理工具。就个人而言,我喜欢使用 subversion(用于版本控制)、maven(用于项目/构建管理)和 hudson(用于持续构建/集成)的组合。

我发现 maven 带来的约定对于上下文切换非常有用,并且非常适合依赖管理。如果 jar 不在存储库中,这可能会令人沮丧,但您可以在本地安装它们,当您准备好后,您可以托管自己的私有存储库,该存储库镜像其他位置。我在http://www.sonatype.com/使用 sonar.nexus 时有很好的体验。他们还提供了一本优秀的免费书籍来帮助您入门。

现在可能看起来有点矫枉过正,但现在建立一个好的构建/测试/集成/发布环境,以后会有所收获。改造总是更难,而且你可以很容易地复制它。

最后,我碰巧更喜欢 Maven 的 Netbeans 集成,但这只是我 :)

于 2010-07-06T14:58:49.380 回答
1

看看蚂蚁常春藤。http://ant.apache.org/ivy/

于 2010-07-06T13:49:06.007 回答
0

您的一些主题是部署和发布管理的一部分。

您可以查看以下产品:Xebia DeployIt
(带有免费的个人版

于 2010-07-06T13:44:14.813 回答