【问题标题】:Advice on a good Java build tool, well integrated with eclipse关于一个好的 Java 构建工具的建议,与 eclipse 很好地集成
【发布时间】:2011-03-12 07:30:07
【问题描述】:

我在一个小团队(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 并对其进行了扩展。

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

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

抱歉,这条消息太长了。 并提前感谢您的建议。

亲切的问候,

拉斐尔

【问题讨论】:

  • 构建工具(如 Ant、Ant+Ivy、Gradle、Maven 2 等)或持续集成引擎(如 Hudson、CruiseControl、Bamboo、Teamcity 等)?构建工具并不是真正的 CI 工具(它们可用于实现基本的 CI 流程,但我不认为它们是 CI 工具)。你也许应该澄清一下。
  • 是的,你是对的,我需要的不是持续集成,而是构建工具。我在标题中更改了它。

标签: java eclipse maven-2 ivy gradle


【解决方案1】:

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

版本控制和存储库的概念是内置在 Maven 中的,它们可以适用于此。

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

Maven 2 还支持version ranges(我并不真正推荐它们,但这是另一回事),例如允许将 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 中?跨度>
【解决方案2】:

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


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

  • eclipse IDE
  • 水银
  • bugzilla
  • 行家
  • 连结
  • 哈德逊 CI

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

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

【讨论】:

  • 嗯,据我所知,“持续集成”可能不是正确的术语。我不需要外部服务器来自动/定期为我构建源代码。我只需要能够不时在共享服务器上推送我的模块的新版本并管理依赖关系。
  • ...感谢您在工作完成后更改要求... ;)
  • 对不起。作为开发人员,您应该习惯! ;)
  • @Raphael - 是的,你是对的。作为客户,我已经习惯了这样一个事实,即公司会在工作完成后调整他们对需求的解释以满足产品规格;-))
【解决方案3】:

我们已经开始将 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 附带的示例项目都很好。它们会让您快速启动并运行。

【讨论】:

  • 不幸的是,我没有找到一个好的 Eclipse IDE 集成(自动完成、任务列表、标记错误、脚本向导等)。有吗?
  • Cengiz,我已经搬回了 maven 环境(换了工作)。但是我们会安装 groovy 插件并告诉它匹配 .gradle 文件,这样我们至少可以得到一些语法高亮等,因为它本质上是 groovy 代码。但是,有一个插件正在开发中(我认为它取决于 STS,但您也可以在 vanilla eclipse 上运行它)static.springsource.org/sts/docs/2.7.0.M1/reference/html/gradle/…
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

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

    【讨论】:

      【解决方案6】:

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

      您可以查看以下产品:Xebia DeployIt
      personal edition 是免费的)

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 2011-04-22
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2012-01-27
        相关资源
        最近更新 更多