设为首页 收藏本站
查看: 586|回复: 0

[经验分享] Apache Maven和Apache Ant,你该选谁

[复制链接]

尚未签到

发表于 2017-1-1 11:22:38 | 显示全部楼层 |阅读模式
Maven是什么?如何回答这个问题要看你怎么看这个问题。绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。构建工程师和项目经理会说Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发。
 
 
像Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团队成员间的交流。
一个更正式的Apache Maven1 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project ObjectModel),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency ManagementSystem),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。别让Maven是一个"项目管理"工具的事实吓跑你。如果你只是在找一个构建工具,Maven能做这个工作。
 
 
我们认识到许多组织必须在 Apache Ant 和 Apache Maven 之间做一个选择。本节我们对比一下这两个
工具:
 
Ant在构建过程方面十分优秀,它是一个基于任务和依赖的构建系统。每个任务包含一
组由XML 编码的指令。有 copy 任务和 javac 任务,以及 jar 任务。在你使用 Ant
的时候,你为Ant 提供特定的指令以编译和打包你的输出。看下面的例子,一个简单
的 build.xml 文件:
<projectname="my-project" default="dist" basedir=".">
<description>
simpleexample build file
</description>
<!--set global properties for this build -->
<propertyname="src" location="src/main/java"/>
<propertyname="build" location="target/classes"/>
<propertyname="dist" location="target"/>
<targetname="init">
<!--Create the time stamp -->
<tstamp/>
<!--Create the build directory structure used by compile -->
<mkdirdir="org.apache.maven.model.Build@d7e661"/>
</target>
<targetname="compile" depends="init"
description="compilethe source " >
<!--Compile the java code from ${src} into org.apache.maven.model.Build@d7e661<javac srcdir="${src}"destdir="org.apache.maven.model.Build@d7e661"/>
</target>
<targetname="dist" depends="compile"
description="generatethe distribution" >
<!--Create the distribution directory -->
<mkdirdir="${dist}/lib"/>
<!--Put everything in org.apache.maven.model.Build@d7e661 into theMyProject-${<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar"basedir="org.apache.maven.model.</target>
<targetname="clean"
description="cleanup" >
<!--Delete the org.apache.maven.model.Build@d7e661 and ${dist} directory trees<delete dir="org.apache.maven.model.Build@d7e661"/>
<deletedir="${dist}"/>
</target>
</project>
 
在这个简单的Ant 例子中,你能看到,你需要明确的告诉 Ant 你想让它做什么。有
一个包含javac 任务的编译目标用来将 src/main/java 的源码编译至 target/classes
目录。你必须明确告诉Ant 你的源码在哪里,结果字节码你想存储在哪里,如何将这
些字节码打包成JAR 文件。虽然最近有些进展以帮助 Ant 减少程序,但一个开发者对
Ant的感受是用 XML 编写程序语言。
 
用Maven 样例与之前的 Ant 样例做个比较。在 Maven 中,要从 Java 源码创建一个
JAR文件,你只需要创建一个简单的 pom.xml,将你的源码放在 /usr/local/hudson/
hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/
java,然后从命令行运行 mvn install。下面的样例 Maven pom.xml 文件能完成和之
前Ant 样例所做的同样的事情。
 
一个简单的 Maven pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
 
这就是你pom.xml 的全部。从命令行运行 mvn install 会处理资源文件,编译源代
码,运行单元测试,创建一个JAR ,然后把这个 JAR 安装到本地仓库以为其它项目提
供重用性。不用做任何修改,你可以运行mvn site ,然后在 target/site 目录找到
一个index.html 文件,这个文件链接了 JavaDoc 和一些关于源代码的报告。
 
Maven以插件的形式为一些一般的项目任务提供了内置的智能。如果你想要编写运行
单元测试,你需要做的只是编写测试然后放到/usr/local/hudson/hudson-home/jobs/
maven-guide-zh-to-production/workspace/content-zh/src/test/java,添加一个对
于TestNG 或者 JUnit 的测试范围依赖,然后运行 mvn test 。如果你想要部署一个
web应用而非 JAR ,你需要做的是改变你的项目类型为 war ,然后把你文档根目录置
为/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
content-zh/src/main/webapp。
 
当然,你可以用 Ant 做这些事情,但是你将需要从零
开始写这些指令。使用Ant ,你首先需要确定 JUnit JAR 文件应该放在哪里,然后你
需要创建一个包含这个JUnit JAR 文件的 classpath ,然后告诉 Ant 它应该从哪里
去找测试源代码,编写一个目标来编译测试源代码为字节码,使用JUnit 来执行单元
测试。
 
没有诸如antlibs 和 lvy 等技术的支持(即使有了这些支持技术),Ant 给人感觉是
自定义的程序化构建。项目中一组高效的坚持约定的Maven POM ,相对于 Ant 的配置
文件,只有很少的XML 。Maven 的另一个优点是它依靠广泛公用的 Maven 插件。所有
人使用Maven Surefire 插件来运行单元测试,如果有人添加了一些针对新的测试框
架的支持,你可以仅仅通过在你项目的POM 中升级某个特定插件的版本来获得新的功
能。
 
使用Maven 还是 Ant 的决定不是非此即彼的,Ant 在复杂的构建中还有它的位置。
如果你目前的构建包含一些高度自定义的过程,或者你已经写了一些Ant 脚本通过一
种明确的方法完成一个明确的过程,而这种过程不适合Maven 标准,你仍然可以在
Maven中用这些脚本。作为一个 Maven 的核心插件, Ant 还是可用的。自定义的插件
可以用Ant 来实现,Maven 项目可以配置成在生命周期中运行 Ant 的脚本。
  说到这里,大家可以看出我这边儿更多的讲的是maven的优点而不是ant的(是不是很偏见,额.....)
  所以该选择谁,大家也别指望我了,我是热烈的支持着maven的,但是我以为不管大家选择哪一个,
  习惯哪一个,最好也把另外一个也研究一下,相互比较着学习,更能让你的思路清晰,更能让你在比较
  中收获的更多,更全面。
  ps:下篇文章,我打算写写maven的安装和基本的使用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-322403-1-1.html 上篇帖子: apache+tomcat负载平衡 下篇帖子: org.apache.commons.logging基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表