`

《转》为什么要抛弃maven

 
阅读更多

项目需要,开始学习maven,今天花了一整天的时间,看完了《Maven实战》这本书。书是好书,看完之后,对maven整体有了较多的了解,也知道了在项目中怎么去使用,感觉收获很大。

我感觉maven这一套还是很严谨的,虽然繁杂,但是感觉很规范,各种情况它都考虑到了。而且跟Jenkins结合起来,也是很方便的。我想不到还有什么更好的办法可以解决它所要解决的问题。

突然想到:为什么我以前不喜欢用maven?为什么似乎人们也不喜欢maven呢?

我不喜欢是因为我以前没有掌握maven,看到那大堆的xml,总有种无法下手的感觉。而且在使用中时老是遇到问题,却很难在短时间内找到答案。总觉得它太笨重了。

今天看完书也证实了我之前的看法是正常的。maven设计了一套复杂的体系,比如库的坐标、依赖、生命周期、插件等,环环相扣,如果不把这一套东西 都搞明白,是没法下手的。这种情况,跟angularjs很像,都是设计了一套相对封闭但又有特色的体系,虽然内部配合很好,但对于外界就没那么友好了。 在花时间了解、适应、认同它之前,会经常撞墙的。

但为什么人们也不喜欢maven呢?应该有很多人对maven很熟悉的,但为什么他们还在寻找更好的工具呢?比如buildr,比如gradle?

今天带着疑问,我搜索了一些文章,大概明白了。

首先要提一下ant,ant与maven是两个极端。ant很灵活,如同瑞士军刀,但没有统一的流程,需要写很多的代码,且每个人都有自己的一套。而maven则相反,定义了严谨、繁琐的流程,考虑了很多,但具体到某一个任务的时候,又不够灵活。要么你去搜别人写好的插件,要么自己写,不论哪种方式,都会让人觉得束手束脚,感觉被maven设计出来的锁链绑着。一想到随便来点什么都要上插件,让人压力巨大。

看到thoughtworks以前有一篇讲maven的文章,提到说,对于构建工具,在plugin的层面上抽象,还是不够灵活。还是需要一种能语言层面上抽象的工具。比如buildr,比如gradle。(原文找不到了,这是我根据搜到的片断自己理解的)

而gradle正好填上了这两个极端的中间。它利用groovy提供的dsl,写起来要比xml舒服很多,而且可以直接如果函数调用般调用ant提供的工具,还可以直接写groovy(Java)代码。相比ant/maven,人们反映使用它的感觉要舒服多了。

希望这个项目有机会尝试一下gradle。


更新:

想不到这篇不太有营养的文章上了“tw好声音”。正好这几天在志恒同学的努力下,成功的把项目中的maven换成了gradle,所以赶紧上来补充两句。

首先关于maven,大家可以看看评论中杨博这篇霸气的文章:《如果我来设计Maven》,深度有营养。

然后讲讲项目的情况。

客户的项目是一个java项目,用maven管理。虽然代码不多,但是分成了好几个模块。在根目录下放一个总的POM.xml,然后每个子模块里一个POM.xml,包含在总POM里。这几个月我们一直在它的甚础上开发,对它进行了多次修补,感觉如下:

  1. 运行慢。运行一次<code>mvn clean test</code>,差不多要五分钟时间,够上个厕所泡杯水再聊聊天了。而且每多一个模块,就会多出一截时间。
  2. 日志乱。maven的日志真是超乱,非常难以阅读。每次出点问题想从日志里找线索,都是一场折磨
  3. 文档难。遇到问题想从maven官网上找点资料,感觉很难。满屏幕都是文字,为什么看不到自己需要的?
  4. 插件烦。P大的一点事也要加插件!比如,我们想建个跟src平级的integationTest目录,也要下插件!一堆配置!
  5. 心情差。每次编辑POM、看到POM、甚至想到POM,都感觉压力巨大,直接影响写代码心情~

前些天终于要开始开始一个新模块了,志恒同学实在忍不住,喊出“风险我担!周末加班我也干!”的壮语后,花了两天时间,不仅在新模块里配好了gradle,还把之前多个maven模块也换好了,包括POM里调用的所有插件。在此向志恒同学致敬:)

现在的gradle脚本看起来舒服多了。代码简洁、结构清晰、配置简单,再配上它的吉祥色绿色,有种春风拂面的感觉:

  1. gradle代码是由groovy写成的dsl,写起来有种json的感觉,简洁清晰,一句废话都很难找到。
  2. 文档很好。由于gradle语法不像XML那样能提示,所以它的网站文档很好。清晰、解释清楚,示例丰富,很有帮助
  3. 插件丰富。gradle内置了对ant任务的支持,表示各种ant任务你都可以直接拿过来用。并且在gradle里,可以用一种很简洁的语法去调用它们,像调用函数一般
  4. 功能强大。gradle代码实际上就是groovy代码,所以可以方便地嵌入groovy代码。你既可以在里面加个println "hello"什么的帮助调试,又能写一些较复杂的groovy代码实现一些复杂的功能。既强大,又灵活。如果需要,不要怕学习另一门语言,因为比起你“精通maven”所花费的时间精力可要少多了。

由于项目保密的原因,不方便贴出实际代码,不过在网上应该可以搜到很多maven与gradle代码的对比例子。我个人感觉因为有了gradle,groovy终于有了一个杀手级的项目。

等在项目中有更多的gradle使用经验时,再来更新。

分享到:
评论

相关推荐

    Eclipse集成SrpingBoot、svn、Gradle、Jetty、Maven等第三方插件

    综上所述,通过以上步骤,您可以轻松地在Eclipse Mars环境中集成Spring Boot、SVN、Gradle、Jetty、Maven等第三方插件,为您的Java开发带来极大的便利。这些工具不仅能够提高开发效率,还能帮助您更好地管理和维护...

    Java项目构建新型利器——Gradle

    综上所述,Gradle之所以能够成为现代Java项目构建的新利器,是因为它结合了Ant的灵活性和Maven的规范性,同时抛弃了XML,利用Groovy语言的简洁和强大,提供了一个更加直观和易用的构建工具。它支持多语言项目,有着...

    IDEA搭建SpringBoot离线工程的方法

    从配置形式上来说,SpringBoot完全抛弃了繁琐的XML文件配置方式,而是替代性地用注解方式来实现。SpringBoot集成的插件更多,从而使用很多服务,都只是引入一个依赖,几个注解和Java类就可以用了。 二、SpringBoot...

    struts2零配置convention-plugin

    从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行...

    为WebView中的Java与JavaScript提供安全可靠的多元化互通方案.zip

    为WebView中的Java与JavaScript提供【安全可靠】的多元化互通方案安全的 Java-JS WebView 桥接器抛弃使用高风险的WebView的addJavascriptInterface方法,通过对js层调用函数及回调函数的包装,支持异步回调,方法...

    多语言国际化支持库,暂时只支持中英文切换,简单易用,无其他库依赖,修改可本地存储固化,.zip

    多语言国际化支持库,暂时只支持... }1.1.0版本发布,,​​采用完全和1.0.0不同的方案,抛弃需要重写控件的限制,如下继承方式同上,版本号为1.1.0 ####1.使用前必须在Application中初始化public class App extends A

    自动化测试之idea+gradle+JUnit的使用(参数化测试与非参数化测试)

    本次博客更新的是,上次使用eclise+JUint测试完,想用idea进行测试,同时maven项目已经学习过了,想学习新的知识为前提。 知识储备, Gradle是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建...

    rocketmq-spring-boot-starter:RocketMQ的Spring Boot启动器

    发送即忘消息(可能由于直接抛弃所有异常导致消息静默丢失,弃用) 拉取方式消费(配置方式复杂,位点可能发生偏移,弃用) 简单入门实例 1.添加maven依赖: &lt; groupId&gt; com . maihaoche &lt; / groupId &gt; ...

    JSONTOFROMJAVA

    您可以看到许多 Java 应用程序开始抛弃 XML 格式并开始使用 json 作为新的数据交换格式。 Java 是关于对象的,很多时候,您需要将对象转换为 json 格式以进行数据交换,反之亦然。 如果您已经配置了 Maven 项目,...

    Building-REST-Services-with-Spring

    最后,在`build`标签内配置了Maven War插件,确保项目能够正确打包为WAR文件。 #### 三、构建REST API 1. **Spring 3与Java配置** 一旦项目结构搭建完成,下一步就是使用Spring 3和Java配置来构建REST API。...

    Gradle 实战中文版

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。

    实战gradle_中文完整_高清带书签

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。高清带书签

    Gradle实战入门教程-整合版

    它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。 gradle提供了什么 1. 一种可切换的,像maven一样的基于约定的构建框架,却...

    springboot

    Spring Boot 完全抛弃了传统的XML配置方式,转而使用注解来进行配置。例如`@SpringBootApplication`注解集成了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`三个注解的功能。 - `@...

    实战Gradle_中文完整版

    实战Gradle_中文完整版 pdf 文档 , Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用...

    gradle-6.0-rc-3-all.zip

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。...

    Gradle-入门.doc

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。 面向Java应用为主。当前其支持的语言限于Java、...

Global site tag (gtag.js) - Google Analytics