我在一个小团队(3人)的几个模块(目前大约10个)上工作。构建版本的编译,集成和管理变得越来越乏味。 我正在寻找一个好的构建/集成工具来替换/完成Ant。
以下是我们当前开发环境的描述: - 几个模块取决于每个第三方JAR - 有些可能会导出JARS,某些导出WARS,某些导出独立,可运行的JARS(使用Fat-Jar) - 所有人的Javadoc - 我们使用eclipse - 每个模块的自定义Ant脚本。 eclipse配置和Ant脚本之间的许多冗余信息。例如,对于独立的Fat-JAR,我们列出了所有的递归依赖关系,而理想情况下,它可以清楚地从eclipse配置中导入。 - 源代码使用SVN
进行版本控制以下是我想要的完美集成工具:
自动化模块的发布和版本控制。理想情况下,集成工具应检测是否需要新版本。例如,如果我想要发布依赖于项目B的项目A,并且如果我在本地对项目B进行了小的更改,那么集成工具应该首先发布新版本的B并根据它
与eclipse强烈集成,以便它可以从其配置中获取模块和第三方库之间的依赖关系。顺便说一下,我想继续用eclipse配置构建路径而不更新其他一些“.xml”的东西。我看到Gradle可以从其配置中生成eclipse项目文件,但是对应的文件很棒。
在本地项目上启用“实时”透明开发。我的意思是我经常在开发主要/“叶子”项目时对核心/公共项目进行小的更改。我希望对核心项目的更改立即可用于项目,而无需发布(甚至本地)我的核心项目的JAR。
将我的模块的所有版本都存储在外部服务器上。最简单的(共享文件夹/ Webdav)将是最好的。一个包含模块列表和交付工件的漂亮网页也很棒。
我环顾四周寻找很多东西。从Ant4eclipse(将Eclipse配置集成到我的Ant脚本中)到Maven / Ivy / Gradle工具。
我有点困惑。 这是我到目前为止所理解的: - Maven是一个伟大的/大工具,但有点僵硬,迫使你屈服于它的结构和概念。它基于描述而不是脚本。如果你走出这条道路,你必须开发自己的插件。 - 常春藤不如maven强大,它处理的东西少,但更灵活。 - Gradle介于两者之间。这是通用的。它支持脚本以及“基于约定”的配置。它集成了Ant并扩展了它。
所以在这一点上,我正在寻找真实用户的实际推荐。 你用什么工具?怎么样 ?你有和我一样的需求吗? 它是否会缓解你的生活或妨碍你的生活?
是否有一些用例或工作区框架的示例,我可以将其作为起点来查看这些工具的功能?
抱歉此消息的长度。 并提前感谢您的建议。
亲切的问候,
圣拉斐尔
答案 0 :(得分:2)
CI工具?对我来说,只有一个:the Hudson CI。
我已经为Java设置了一次软件开发环境,其中包含以下组件:
和一些apache,mysql,php,perl,python,..进行集成。
hudson没有与eclipse集成,这是故意的,因为我想在一个单独的服务器上构建。对于所有其他工具,我有一个完美的交叉集成(比如:myclipse on eclipse与bugzilla交谈,m2eclipse使用maven eclipse,很多插件用于哈德森,......)
答案 1 :(得分:2)
自动化模块的发布和版本控制(...)
版本控制和存储库的概念是内置的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有一些学习曲线。
答案 2 :(得分:2)
我们已经开始将Gradle集成到我们的构建过程中,我可以添加已发布的答案,Gradle也可以使用。你的假设大多是正确的,gradle更多的是袖口,但功能强大,允许脚本等在构建本身。似乎maven可以做的大多数事情,gradle也是如此。
现在为您的个人观点:
版本控制:gradle支持依赖关系图,版本控制,如果添加CI服务器,则可以触发自动/依赖版本。例如,我们几乎所有的'可交付成果'都是.wars,但我们在开发中有几个代码库(.jars)和一个可执行文件.jar。一种配置是使战争和“胖子”依赖于共享代码库。然后,当更新共享库时,使用共享库中的版本,测试消耗项目,然后使用Hudson启动依赖项目的能力来重新部署它们。还有其他方法,但这对我们来说似乎最有效。
与eclipse强烈整合:你说得对,gradle可以生成eclipse文件。一旦我们开始,我们倾向于仅使用eclipseCp(更新.classpath)任务,因为只有类路径需要更改。它有点古怪(抓住你的默认JRE,所以确保它是正确的,如果你需要它不会添加exports =“true”),但是你可以获得99%的优势。
在本地项目上启用“实时”和透明的开发:这是我不确定的。在这种情况下我只是围着gradle攻击;删除耗材项目中的工件并在eclipse中标记共享项目,然后再恢复。
将我的模块的所有版本都存储在外部服务器上:简单且支持许多方法,类似于Maven。
就示例而言,gradle的文档很好,以及带有完整zip的示例项目。它们会让你快速上手并运行。
答案 3 :(得分:1)
看看Ant Ivy。 http://ant.apache.org/ivy/
答案 4 :(得分:1)
没有银子弹,但根据我的经验,Maven是一个很棒的项目管理工具。就个人而言,我喜欢使用subversion(用于版本控制),maven(用于项目/构建管理)和hudson(用于连续构建/集成)的组合。
我发现maven带来的约定对于上下文切换非常有用,对于依赖管理非常有用。如果罐子不在存储库中,可能会令人沮丧,但您可以在本地安装它们,当您准备就绪时,您可以托管自己的私有存储库,这可以反映其他地方。我通过http://www.sonatype.com/使用sonar.nexus获得了很好的经验。他们还提供了一本优秀的免费书籍来帮助您入门。
现在看起来似乎有些过分,但现在建立一个良好的构建/测试/集成/发布环境,以后会产生分红。它经常难以改装,而且你可以轻松复制。
最后,我碰巧更喜欢Netbeans整合maven,但那只是我:)
答案 5 :(得分:0)
您的一些主题是部署和发布管理的一部分。
您可以查看以下产品: Xebia DeployIt
(personal edition是免费的)