有哪些好用的Java构建工具?

11

我正在寻找一种用于构建大型Java程序的“make”工具。我已经知道了ANT,但想看看还有哪些可用的选项。

理想情况下,它应该能够处理.GNU Make难以处理的.java->.class软件包目录混乱问题。

Win32系统,但跨平台是一个加分项。

编辑: 我发现使用ANT存在一些缺点,这就是为什么我想看看其他选择的原因,不过我可能最终还是会使用它,因为它可行。

  • 需要复杂的XML makefile文件,“HelloWorld”文件已经有25行了,而任何更合理的程序很快就变得很大。
  • 它解决了我所有的问题。
    • ant使编写jar和javac命令行更容易,生成清单更容易,指定.java源文件更容易,指定jvm/java属性更容易,编写自定义构建工具更容易。
    • Ant并不能使Java类依赖关系更容易,并且似乎没有更强大的变量系统,这两个问题通常由make工具解决。

我会使用GNU make,但它无法确定具有软件包声明的.java文件的.class文件将在何处结束。

13个回答

6
Ant和Maven绝对是两个标准。如果您已经熟悉Ant并想要使用Maven提供的依赖管理,可以看一下Ivy
Ant和Maven都缺乏真正的控制结构来编写脚本。虽然有一些Ant插件可以提供部分控制,但是(如果您已经熟悉Ant),您可以看一下Gant,它是Ant的Groovy包装器。

4
如果你正在开始一个新项目,你可能需要了解一下 Maven。它的使用起来可能有点困难,但它可以为你处理许多事情,包括依赖项。
如果你已经有一个项目想要为其创建构建文件,除了之前提到的 Ant,我没有其他的推荐。

4

忘记ANT吧!!

如果你问我,Apache Maven才是正确的选择。

我最喜欢的功能是它内置的依赖管理。 这意味着您不必将第三方JAR文件检入源代码控制项目中。

您可以在maven POM(项目对象模型 - 它基本上是项目的XML描述)中指定依赖项,maven会自动下载、编译并将它们与您的应用程序打包。

其他非常好的功能包括: 发布管理和分发发布 - 使用maven控制台命令执行发布。此功能将在源代码控制中标记您的代码库。检出干净副本,构建并打包以进行部署。第二个命令将其上传到您的存储库以分发给其他最终用户。

大量增长的库存储库已经使用maven - 每个Apache项目都使用maven。还有更多的库也加入进来了。看看这里的主要库存储库

能够托管自己的存储库。 - 在那里,您可以发布自己的构建版本,并上传不存在于其他公共存储库(如大多数SUN JAR)的JAR文件。


1
如果你正在做任何有价值的事情,你必须使用Maven托管自己的存储库,否则你会有多个单点故障(其他人的存储库)。此外,Maven的文档...缺乏。 - Dan Dyer
1
它有一些缺陷,但最终我发现Maven是迄今为止最好的Java构建工具/依赖管理器。如果没有Maven,我早就被Java逼疯了。 - Benson

2
多年来,ant 一直是领导者。但由于其基于xml的 build.xml 文件非常冗长,因此可以通过与 ivy 结合实现依赖关系管理。 maven 致力于提供 ant+ivy 组合所提供的开箱即用功能,使用起来很好。但如果它停止实现这样的功能,您必须找出它在依赖管理方面的问题,这可能是您可以想象到的最糟糕的地狱。另外,它的 pom.xml 文件也是以 xml 写的。 sbt 是王牌 scala 构建工具,使用 ivy 进行依赖关系管理,并且构建文件是用 scala DSL 编写的。相当成熟,但 scala 方言可能不适合您。 buildr 的构建文件是用 ruby 指定的。兼容 maven 存储库并带有自己的依赖项管理。还有 ant 集成。 gradle 使用 groovy 进行构建文件。除了支持 maven 或 ivy 外,现在还拥有自己的依赖管理器,之前曾使用过 ivy,但不满意。无缝 ant 集成。语法最简单。
ant、ivy、maven、buildr 是 Apache 项目。
TL;DR 检查 gradlebuildr

很好的相当全面的列表,谢谢。我会简要地查看Gradle和可能的SBT。 - davenpcj

2

这不是一个答案,而是一个问题。ANT 是构建 Java 的标准方式。它与 Java、众多 Java 工具以及 Cruise Control 都能很好地配合使用。那么,为什么你还要尝试其他东西呢?

除非你有一种 ANT 无法覆盖的特殊情况,否则我建议你坚持使用 ANT。

当然,如果有更有见地的人指出我的态度是愚蠢的,或者为什么要考虑其他替代方案,我会很高兴听取意见的 ;)


1
ANT 过于臃肿,XML 很繁琐,而且很难避免重建所有内容。 - wnoise
蚂蚁提供了构建所有内容的命令,但这是因为javac足够聪明,不需要这样做。虽然XML很丑陋,但如果我不想看它,就可以选择让我的IDE处理它,或者我可以自定义它。 - Bill the Lizard
2
基本上 Ant 的优点在于你不必看它,也无需智能构建项目。老实说,我可以用脚本来做到这一点。 - davenpcj

2

如果你需要一个相对轻量级的选项,scons 是一个不错的选择。我用过一点,发现它相当容易理解,特别是如果你已经了解 Python 语法的话。另一个选择是 maven,但它绝对不是简单的。然而,它提供了许多额外的功能,例如帮助管理文档。但我不会把它称为 make 的替代品;)


1

jmk。它是原始的,但是非常小,你可以把它嵌入到源代码.tar.gz文件中,几乎不会改变它的大小。


看到了 JMK,但无法确定它是否只是用来替代 make,还是比 make 更智能地处理 Java。你有使用过它的经验吗? - davenpcj
它几乎是make的直接替代品,并具有类似的功能集。要解决目录问题,您需要使用解析Java源代码的工具。 - finnw
正确。对于C编译器,有生成依赖项的参数,以与构建相同的方式解析路径。理想情况下,javac也应该这样做。 - davenpcj

1

除非Maven最近真的有很大的改进,否则我会远离它。当然,除非你有一些庞大的“多项目”,有数不清的依赖关系。

在尝试做最简单的事情(比如将war文件FTP到服务器上)时,看着完全无用和没有帮助的错误信息,我已经厌倦了,于是放弃了Maven,重新使用Ant。从那以后,我再也没有回头看过。


0

显然,有经典的make(make、gmake、nmake)工具,还有一些用Ruby或Python编写的构建系统(我想)。它们不是Java特定的,而只是可脚本化的构建系统。

但是ANT已经成为领头羊推动8-9年了,在基础方面,它非常容易入门。

早些时候,make在编译Java方面特别糟糕,因为它通常会为每个文件单独调用javac编译器。ANT没有这个问题,也许可以修改make以避免这种情况。但这是ANT受欢迎的因素之一。它非常快速。

我知道ANT可能不是完美的解决方案,但它确实很实用。


GNU Make 可以使用 + 目标语法一次构建多个文件,该语法可以通过编程方式构建。也可以指定类似库的目标,仅重新构建已更改的源文件,但所有操作都在一个命令行中完成。 - davenpcj
同样适用于大多数其他构建工具,供您参考。 - davenpcj

0

我从Ant转换到Maven 2后就再也没有回头了。Ant和Maven 2是构建的不同方式。使用Ant时,您会给出如何构建事物的指令。而使用Maven 2,则是告诉它您想要构建什么。如果您已经有一个现有的Ant build.xml文件,您可以通过将其包装在Maven 2 pom.xml中来重构您的构建。


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