一个好的Java构建工具推荐,需要与eclipse良好集成

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并扩展了它。

目前我正在寻找来自真实用户的实际见证。

你用什么工具?怎么用?你有与我相同的需求吗?

这些工具是让你生活更轻松还是更加复杂了呢?

是否有一些使用案例或者工作空间骨架可以作为起点,以了解这些工具的功能?

对于信息的长度我感到抱歉。

非常感谢您的建议。

此致敬礼,

Raphael


一个构建工具(如Ant、Ant+Ivy、Gradle、Maven 2等)或持续集成引擎(如Hudson、CruiseControl、Bamboo、Teamcity等)?构建工具并不是真正的CI工具(它们可以用于实现基本的CI过程,但我不认为它们是CI工具)。你可能需要澄清一下。 - Pascal Thivent
是的,你说得对,我需要的不是持续集成,而是构建工具。我已经在标题中更改了它。 - Raphael Jolivet
6个回答

2

CI工具?对我来说,只有一个:Hudson CI


我曾经为Java设置过软件开发环境,包括以下组件:

  • eclipse IDE
  • mercurial
  • bugzilla
  • maven
  • Nexus
  • Hudson CI

还有一些用于集成的apache、mysql、php、perl、python等。

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


从我所看到的情况来看,“持续集成”可能不是正确的术语。我不需要外部服务器自动/定期地为我构建源代码。我只需要能够不时地将我的模块的新版本推送到共享服务器上并管理依赖关系。 - Raphael Jolivet
谢谢你在工作完成后更改需求... ;) - Andreas Dolk
抱歉,作为开发者,你应该习惯了!;) - Raphael Jolivet
@Raphael - 是的,你说得对。作为客户,我已经习惯了这样一个事实,即公司会在工作完成后调整他们对需求的解释以满足产品规格要求 ;-)) - Andreas Dolk

2
自动化模块的发布和版本控制(...)
版本控制和代码库的概念已经内置于Maven中,它们可以适用于这里。
Maven支持SNAPSHOT依赖项。当使用快照时,每次运行构建时Maven会定期尝试从存储库下载最新可用的快照。快照通常用于项目正在积极开发中的情况。
Maven 2还支持版本范围(我不太推荐使用它们,但这是另一个故事),例如配置A依赖于B的版本[4.0,)(大于或等于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有一些学习曲线。


M2Eclipse是否支持双向同步,即如果我在Eclipse中更新项目设置(例如添加额外的源文件夹),它是否会自动将其添加到pom.xml中? - Lars Tackmann

2
我们已经开始将Gradle集成到我们的构建过程中,我可以补充之前发布的答案,Gradle也可以工作。你的假设大部分是正确的,Gradle更加随意,但是功能强大,允许在构建过程中进行脚本编写等操作。似乎大多数Maven可以实现的事情,Gradle都可以实现。
现在来看看你提到的几个问题: 版本控制:Gradle支持依赖映射、版本控制,如果你添加了CI服务器,你可以触发自动/依赖构建。例如,我们几乎所有的“交付成果”都是.war文件,但是我们有几个代码库(.jar)和一个可执行的.jar文件正在开发中。一种配置方式是使wars和“fat-jar”依赖于共享代码库。然后,当共享库更新时,增加共享库的版本,测试消费项目,然后使用Hudson的能力来触发依赖项目以重新部署它们。还有其他方法,但是这对我们来说目前似乎是最好的。 与Eclipse强烈集成:你是正确的,Gradle可以生成Eclipse文件。我们倾向于只在启动后使用eclipseCp(更新.classpath)任务,因为只有classpath需要更改。这有点古怪(获取您的默认JRE,所以确保它是正确的,如果需要,不添加exported ="true"),但可以让您完成99%的工作。 启用本地项目上的“实时”和透明开发:这是我不确定的一个问题。在这种情况下,我只是在Gradle中进行了一些hack操作;通过删除消费项目中的构件,并在Eclipse中将共享项目标记为此类项目,然后再恢复。 在外部服务器上存储模块的所有版本发布:简单,支持多种方法,类似于Maven。
至于示例,Gradle的文档很好,以及随全版zip一起提供的示例项目。它们会让你相当快速地上手。

很遗憾,我没有找到一个好的Eclipse IDE集成(自动完成,任务列表,标记错误,脚本向导等)。有没有其他的呢? - Cengiz
Cengiz,我已经回到了Maven环境(换了工作)。但是我们会安装Groovy插件,并告诉它匹配.gradle文件,这样我们至少可以获得一些语法高亮和类似的东西,因为它本质上是Groovy代码。然而,有一个插件正在开发中(我认为它依赖于STS,但你也许可以在纯净的Eclipse上运行它)http://static.springsource.org/sts/docs/2.7.0.M1/reference/html/gradle/gradle-sts-tutorial.html - lucas

1

1

没有银弹,但根据我的经验,Maven是一个很好的项目管理工具。个人而言,我喜欢使用Subversion(用于版本控制)、Maven(用于项目/构建管理)和Hudson(用于持续构建/集成)的组合。

我发现Maven带来的约定非常有用,可以方便地进行上下文切换,并且非常适合依赖管理。如果JAR文件不在存储库中,可能会令人沮丧,但您可以在本地安装它们,当您准备好时,可以托管自己的私有存储库,以镜像其他地方。我使用http://www.sonatype.com/提供的Sonar.Nexus获得了良好的体验。他们还提供了一本优秀的免费书籍,可帮助您入门。

现在建立一个良好的构建/测试/集成/发布环境可能看起来有些过度,但这将在以后产生回报。事后再进行改造总是更困难的,而且这是您可以轻松复制的内容。

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接