`

[转]为什么要用maven<1>

 
阅读更多
 
之前在一个公司接触了一个项目,框架师用到了maven,作为一个小公司的码农,新事物总是令人神往,恰值周末,在iteye看到一篇文章。个人惯例,原作者博客地址:http://jackycheng2007.iteye.com/

 

都说maven很好很强大,我就在想为什么呢?今天不妨认识一下她。 
maven本身的意思是“专家”,大概是告诉人们我很牛。哈哈。我们先看看这个专家的想法: 
Philosophy, 哲学 
一提到maven,你准想到ant,老想和这个build元老级工具比一比谁牛。可以maven却不想和ant比肩。他的目标更远大。ant确实是一个很强大的build工具箱,而maven不想成为第二个。他的想法是想基于模式来建立一个基础架构,这个架构具有可视性,可重用性,可维护性,易于理解等特性。 
这些“性”似乎是我们开发和项目管理中希望做到有很难做到的。停下来,让大脑想一会,你在项目开发中遇到了什么问题: 

每天都在coding,不知道别人在干什么? 
写了半天的代码,偶尔见听到别人以前写过?晕倒 
只知道要实现这个接口,不了解整个项目的构成,和构建过程?迷糊 
勤快的人时不时去看看别人的代码,也常常因为太复杂,不知道从何入手? 

一个项目完成了,要开启一个新的项目,发现这个新的项目除了业务不同外,底层技术和构架,以及构建过程都大部分相似。怎么办?copy过来修改?试过没有?你可能会半途而废。尤其当不是你开发的项目,看懂别人的,没门。大部分都是把lib copy过去,管他有没有用。多了比少了强。再吧ant的build.xml复制过去改一下,大功告成。似乎项目的壳子准备好了,谁然办法土了点,也还凑合。总想应该还有更好的办法。。。 

回顾过去做过的项目,是不是总是重复着built, tested, packaged, documented and deployed这些过程,当然,这都是pm不可少的。这些过程在不同的项目中会有不同。Maven说能从变中抽出不变,模式pattern, 让项目组的人都能透过pattern来清晰的认识项目。如果你是pm,有没有在开始的时候觉得创建这样一个空项目感到繁琐,有没有一遍又一遍的给你的team mem说我们的目录要这样建立。如果你的是一个新手,是不是不知道什么是项目,项目中有哪些东西,怎么建目录结构。干脆去baidu helloworld,你会发现五花八门,绝对让你更迷糊。多想有个大拿在旁边指点一下啊。另外,弄了半天,却不知道怎么运行,失败,不搞了。哈哈,有了maven,就如同一个大拿帮你开个好头。有了maven,pm,就像有了秘书,“嗨,小马,准备一个空项目,我们要开工了”,呵呵,不是所有人都有秘书哦。 

什么?maven能帮我们?看来有戏。亮出你的法宝: 
法宝1. Archetype 原型 
字面意思就看出是一种模板技术,模板里面透着模式哦。看来不是吹的。 
利用Archetype,maven能快速帮你生成一个基本的项目,统一的目录结构,基本的配置文件,为什么这样建立目录,这就是总结前人的经验了。这就是项目目录模式吧。安装好maven以后,执行下面的命令就能创建一个基本的项目: 

Java代码  收藏代码
  1. mvn archetype:create \  
  2.   -DarchetypeGroupId=org.apache.maven.archetypes \  
  3.   -DgroupId=com.mycompany.app \  
  4.   -DartifactId=my-app  


这个命令会帮你在执行命令的当前目录生成一个java的Hello World项目。同时还有一个pom.xml,我们后面会谈。另外你会发现他帮你生成了一个基本的目录结构来存放java app代码和test代码。 

所谓万事开头难。但,Archetype使得new user有个很容易的开始。另外,Archetype 还体现了maven支持附加物似地扩充项目的内容。比如,一开始可以用generate产生一个working project,之后可以利用site archetype 来为这个project 添加 一个site。将这个想法延伸一下,如果你想在一个大一些的范围比如公司范围内推行一种项目结构标准。那你就可以自己开发一个模板也就是Archetype,然后把它放在一个集中的repository,以后大家在创建项目的时候直接基于这个Archetype来创建。这样既推行了标准化,有体现了重用性。 
其实mvn archetype:create这个命令是被deprecated了,现在推荐你用mvn archetype:generate。这是一个交互式的插件,maven会列出一些原型让你基于他们构建你的项目,默认是基本的java project,也有一些struts2,spring的样例项目让你选择,很爽的。 
选择完以后,你会得到一个项目目录,就是create差不多。但是如果你要是想在eclipse里面开发,你还可以生成eclipse项目文件,只需要在刚才生成的项目根目录,也就是pom所在的目录执行下面的命令: 

Java代码  收藏代码
  1. mvn eclipse:eclipse  


然后你就可以将这个项目导入eclipse里面开发了。爽吧。 

法宝2. POM 项目对象模型 
既然是项目管理工具,自然是以项目为中心的。pom提供了一个项目的所有相关信息和配置细节。这样,通过一个pom.xml,你就能全面的了解这个项目的各个方面,当然除了项目代码。通过这个文件,你可以build整个项目,直至发布。可见maven所谓让我们比较容易的看到项目的全局,也并非虚言。等一下,让大脑想一会。我知道xml很强大,几乎可以描述任何事物。但是完全靠一个pom.xml,就声称可以简单而清楚的描述一个项目的信息和配置。可能吗?要知道一个项目,除了resource的目录以外,还有以来的lib,测试,发布等信息。怎么才能做到呢? 
project object?什么,对象?难道和java对象一样?还真行。maven说项目可以继承。而且提供了一个super pom,就像java的Object类一样,尽管你不用写extends Object,你的类也会自动继承这个类。同样,maven也让你的pom继承这个super pom。这样可以再super pom提供很多默认设置使得你自己的pom在没有必要修改super默认设置的情况下变得很简单。 
简单浏览了一下这个super pom的2.1版本: 

Java代码  收藏代码
  1. <project>  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <name>Maven Default Project</name>  
  4.   
  5.   <repositories>  
  6. ... 存储库  
  7.   </repositories>  
  8.   <pluginRepositories>  
  9. ... 插件存储库  
  10.   </pluginRepositories>  
  11.   
  12.   <build>  
  13. ... 构建项目所需的信息  
  14.   </build>  
  15.   
  16.   <reporting>  
  17.     报告信息  
  18.   </reporting>  
  19.   
  20.   <profiles>  
  21.     项目描述性信息  
  22.   </profiles>  


具体细节后面再研究,但看这些信息似从这些大类别上也涵盖的差不多了。有了这些默认信息,你自己的pom只要包含下面的信息就好: 
    project root 
    modelVersion - should be set to 4.0.0 
    groupId - the id of the project's group. 
    artifactId - the id of the artifact (project) 
    version - the version of the artifact under the specified group 
下面是一个例子: 

Java代码  收藏代码
  1. <project>  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <groupId>com.mycompany.app</groupId>  
  4.   <artifactId>my-app</artifactId>  
  5.   <version>1</version>  
  6. </project>  

 

分享到:
评论

相关推荐

    springweb-Jackson

    &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt; &lt;version&gt;${jackson.version}&lt;/version&gt; &lt;/dependency&gt; 2:在springweb.xml中加入: &lt;bean class="org.springframework.web.servlet.mvc.annotation....

    一个汉字转拼音的Java开源类库-JPinyin

    &lt;artifactId&gt;jpinyin&lt;/artifactId&gt; &lt;version&gt;1.1.8&lt;/version&gt; &lt;/dependency&gt; Gradle Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories: ...

    word源码java-EndecryptUtil:Java、Android加密解密工具类

    word源码java EndecryptUtil 简介 Java、Android(安卓)加密解密工具类,不依赖于其他库。 导入 gradle方式的引入 需要先在project的build.gradle下添加: allprojects { repositories ...1.字符串转

    calendarist:一个可实现阳历、阴历、干支历间相互转换的JAVA工具

    可实现阳历、阴历、干支历的相互转换使用方法Maven引用&lt;dependency&gt; &lt;groupId&gt;org.hothub&lt;/groupId&gt; &lt;artifactId&gt;calendarist&lt;/artifactId&gt; &lt;version&gt;1.0.7&lt;/version&gt;&lt;/dependency&gt;功能介绍支持1900 - 2100年份的...

    JdbcTemplateTool.zip

    BatchPreparedStatementSetter, 就可以批量update通过一个对PO对象删除对应的数据库记录依然可以使用原始的JdbcTemplate目前只在mysql上测试.Maven 依赖&lt;dependency&gt;  &lt;groupId&gt;org.crazycake&lt;/groupId&gt;  ...

    jox-1.17b3.jar

    &lt; age &gt; 1 &lt;/ age &gt; &lt; name &gt; wangdei &lt;/ name &gt; &lt;/ sub &gt; &lt;/ MarkTest &gt; 下面的程序是把xml转为成javaBean package com.wutka.jox.test; import com.wutka.jox. * ; import java.io. * ; public class ...

    osgb36-letter-conversion:将 OSGB36 Eastings 和 Northings 转换为网格字母表示的库

    osgb36-字母转换 将 OSGB36 Eastings 和 Northings 转换为网格字母表示的库。... &lt; artifactId&gt;osgb36-letter-conversion&lt;/ artifactId&gt; &lt; version&gt;0.1.3&lt;/ version&gt; &lt;/ dependency&gt; 用法 OsgbPointToRefe

    eclipse+egit安装使用+maven安装项目搭建

    Eclipse+Git+Maven项目 1 一、Maven安装 1 1、Maven安装 1 2、Maven插件安装 3 3、配置 Maven 5 二、Eclipse构建Maven项 6 1、建立Maven项目 6 2、配置Maven项目 9 三、Dynamic Web project转成Maven项目 15 ...

    openapi-jaxb:XSD中的OpenApi注释-> DTO生成

    OpenApi 3插件 目录 问题 4.3。... &lt; groupId&gt;hu.icellmobilsoft.jaxb&lt;/ groupId&gt; &lt; artifactId&gt;openapi-jaxb&lt;/ artifactId&gt; &lt; version&gt;1.1.0&lt;/ version&gt; &lt;/ dependency&gt; 2. openapi-jaxb插件 swa

    基于Java和Python的爬虫项目实战源码.zip

    为什么采用宽度优先搜索策略? 深度优先遍历可能会在深度上过“深”而陷入“黑洞”; 重要的网页往往距离种子网页比较近,越深的网页的重要性越低; 万维网深度最多17层,但到达某面总存在一条很短的路径,宽度优先...

    Java工程转换为Maven工程

     在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择。本文如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Java工程转换为Maven工程的工作也是有...

    cookercucumber-maven-plugin:Cooker,一个用于Java Cucumber的Maven插件

    内容 插件功能 该插件具有两种不同的功能,可以分别组合/使用。 能力#1(主要炊具) 将过滤器选择生成(FSG)功能/场景转换为最小的执行片段 ...&lt; dependency&gt; &lt; groupId&gt;com.github.manjunathprabhakar&lt;/ groupId&gt;

    java微信公众号MVC开发框架

    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;weixin&lt;/servlet-name&gt; &lt;url-pattern&gt;/wx/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; load-on-startup表示Servlet在web应用启动...

    corejet:CoreJet 存储库

    1. 下载 CoreJet 源代码并将其安装在您本地的 maven 存储库中。 mvn clean install 或配置 Maven 以从 Maven 中央存储库下载工件。 2. 将您选择的测试实现和故事存储库依赖项添加到您的 Maven 项目中,例如 ...

    http-helper:Http-Helper是对Apache Httpclient和Fluent API的有效的补充,它使得使用Fluent API更加简单方便,它可以直接转换返回的响应体到指定的Java类型,使用者不需要手工的转换,Http-Helper帮助转换了大多数的数据类型,例如:Xml, Json, Json对象,Json数组,私有类型,以及私有类型数组等

    HTTP-HELPER介绍Http-Helper是对Apache Httpclient和Fluent API的有效补充,它使得使用Fluent API更加简单方便,它可以...&lt;dependency&gt;&lt;groupId&gt;com.robert.httphelper&lt;/groupId&gt;&lt;artifactId&gt;http-helper&lt;/artifac

    简单的JavaExcel进程sep4j.zip

     基本示例把数据写入Excel Collection&lt;User&gt; users = Arrays.asList(user1, user2);  LinkedHashMap&lt;String, String&gt; headerMap = new LinkedHashMap&lt;String, String&gt;();  headerMap.put("userId", ...

    baidu-maven.zip

    基于百度开发者接口做的java版图文识别,maven项目源代码

    MCloud - OAuth2 认证中心

    &lt;artifactId&gt;flyway-maven-plugin&lt;/artifactId&gt; &lt;version&gt;4.2.0&lt;/version&gt; &lt;configuration&gt; &lt;user&gt;root&lt;/user&gt; &lt;password&gt;你的数据库密码&lt;/password&gt; &lt;driver&gt;com.mysql.jdbc.Driver&lt;/driver&gt; &lt;url&gt;jdbc:...

    填充Excel列表工具Excel2Entity.zip

    Excel2Entity类库已经加入到Maven中央仓库,如果你的项目使用了Maven,则可以通过添加下面的Maven依赖配置项将该类库加入到您的项目. &lt;dependency&gt; &lt;groupId&gt;cc.aicode.java.e2e&lt;/groupId&gt; &lt;artifactId&gt;...

    Nginx安装包

    1 &lt;dependency&gt;2 &lt;groupId&gt;org.springframework.session&lt;/groupId&gt;3 &lt;artifactId&gt;spring-session-data-redis&lt;/artifactId&gt;4 &lt;version&gt;1.1.1.RELEASE&lt;/version&gt;5 &lt;type&gt;pom&lt;/type&gt;6 &lt;/dependency&gt; 随后我们在...

Global site tag (gtag.js) - Google Analytics