gradle和ant等构建工具有什么核心优势?
水平不高,一直使用eclipse,idea,vs等ide进行开发,运行程序的时候只要按下run或者debug按钮即可自动编译和运行程序,那为什么还需要gradle、ant等构建工具?他们有什么核心优势?感觉这是由于自己对构建工具的概念不理解导致的迷惑,还请各位给予指点。
另外,学习gradle有什么资源可以推荐?有什么经验可以传授下?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
终于遇到一个自己比较喜欢的问题了。
利益相关:gradle重度用户
以下答案,都基于我对gradle的理解。
1.面向未来,就目前的趋势而言,gradle或者maven正逐渐演化为一种标准。尤其是国际上。比如你去spring官网看demo,它们一般提供基于这两种的源码,还有android开发,很多流行的库,demo演示都是通过gradle搭建的,你不懂gradle就很难跟它们接轨。这显然是固步自封的表现。
2.极细的粒度,给你更大的发挥空间。你用eclipse的run的时候,你并不知道eclipse是怎么执行的,即便你知道,但是不可能轻易结合自己的代码逻辑。举个例子:我需要在run java项目的时候,把flex项目先编译好,放到web目录下。类似于这样,大部分情况下,光靠IDE自己的功能就力不从心了。 但是gradle给了你两个维度的机会,让你能干的更多。 第一 task的dependsOn、finalizedBy 让你可以把各种工作串行连接;第二 绝大多数插件是开源的,也就是用的不爽,你自己可以改,那样就更灵活了。当然这只是冰山一角。
3.协作,一个个build文件,描述项目依赖,插件,显然更具有一致性。再也不需要把那些讨厌的jar包提交到git了,要知道git里面存放二进制简直就是灾难。还有,甚至可以通过gradle跟,非程序员交流,比如你想让美工可以自己测试修改并在项目里面看最终效果。这时候你让她装个idea,估计她会很不情愿。但是,你可以通过gradle,告诉她,把素材覆盖到某某文件之后,只要在控制台来个gradle run,刷新页面就能看到效果了。(仅是个例子,可能不严谨)
4.布道groovy,gradle所使用的语言,也许groovy并不能算是jvm里的屠龙刀,但是也绝对可以算是一把锋利的匕首。相信我,作为一个java程序员,试着在代码中融入groovy,一定乐趣无限。尤其是还能用在android项目。
5.还有很多,想到再说。
构建工具第一准则——一致
如果你写的代码不止是一个玩具,那么最终是要上线的,在正式的线上环境,可能遇到任何问题,分析排查故障的前提是你明确知道这里安装的软件是由哪些代码和库构成的,否则,如果找了半天才发现原来线上使用的根本不是你想象的三方库或者代码和你的源码不同,相信我,你一定会有跳楼的心。
解决的办法是一系列的,但是无论如何,首先要确保构建过程稳定一致,所以最好采用同样的工具手段,而自动化进行的构建工作是不可能和IDE整合的,这就是maven、ant,gradle等工具的价值。
另外,maven比ant先进的地方首先是库依赖管理,而gradle比maven的优势则不具有革命性。
最后补充一下我写的文章,有助于理解打包这件事:谈谈软件包
ANT是最早的构建工具,基于idea,好象是2000年有的,当时是最流行java构建工具,不过它的XML脚本编写格式让XML文件特别大。对工程构建过程中的过程控制特别好。
Maven它是用来给Ant补坑的,Maven第一次支持了从网络上下载的功能,仍然采用xml作为配置文件格式,它的问题是不能很好的相同库文件的版本冲突。Maven专注的是依赖管理,构建神马的并不擅长。
Gradle属于结合以上两个的优点,它继承了Ant的灵活和Maven的生命周期管理,它最后被google作为了Android御用管理工具。它最大的*区别是不用XML作为配置文件格式,采用了DSL格式,使得脚本更加简洁。
eclipse用的还是ant编译吧?当你没有ide的时候,例如只能ssh,如果修改了java代码需要重新编译就可以使用ant构建。
很明显的一个优势就是对于依赖的管理,常规模式下我们把依赖放到webroot/web-inf/lib下,时间久了jar包的升级和用途都是令人头疼的问题,而采用构建工具可以很轻松的把jar包管理起来,而且不需要你自己去官网down zip然后找哪个有用哪个没用 谁又依赖了谁
以gradle为例 ,如果需要spring boot autoconfigure只需下面一句话即可,加号代表始终获取最新版本
当然对依赖的管理只是gradle中很小的一部分功能 注入编译 打包 单元测试 与CI集成等都是很容易做到的