`
gao_xianglong
  • 浏览: 461812 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Use Maven3.x

阅读更多

前言

 

关于Maven,已经不再是一个全新的工具。但由于网络中各种褒贬不一的言论太多,一时让Maven淹没于形形色色的唾沫声之中,有很多人觉得Maven的学习门槛太高(是的,笔者也是这么认为,刚接触的时候确实一头雾水,有一种想把电脑从12楼扔下去的冲动),有很多人觉得有Ant就够了,但也有人认为Maven要搭建私服纯粹是扯淡...

 

既然存在这么多质疑,那么笔者为什么还是要讲解关于如何在项目中使用Maven,很简单,因为笔者需要让大家知道Maven究竟能为我们“项目管理”带何种实惠?

 

笔者推崇Maven的理由主要有以下3点:

 

1、如果你每天还在不停且重复的做项目构建(编译、测试、打包、发布),那么你完全需要一种流程化及自动化的方式来帮助你完成这些基础作业层,这便是你选择Maven的理由之一;

   

2、如果你还在为项目中的第三方依赖库发愁,整天想着应该去哪里寻找项目依赖库,或者如何解决依赖库版本冲突问题,或者不想为每一个项目都去建立一个lib文件夹,然后把几十兆甚至上百兆的依赖库做重复的复制和粘贴工作,那么你完全需要一种规范化且高度依赖化的方式来帮助你完成这些令人头痛且纠结的工作,这便是你选择Maven的理由之二;

 

3、全世界都在使用Maven(比如Spring Framework、SapphireCache Framework),你还等什么呢,这便是你选择Maven的理由之三;

 

一、什么是Maven?

 

Maven是一种基于项目对象模型(POM)的项目管理工具(纯Java开发),它可以通过一小段描述信息来管理项目的构建及类库依赖。相对于Ant等传统项目纯构建工具而言,Maven所包含的功能更像是一个功能的超集。

 

二、下载和安装Maven

 

本文所有的内容将完全基于Maven3.0.4版本,其下载地址为:http://maven.apache.org/download.html

当成功下载好Maven后,通过解压,我们可以发现Maven的目录结构为:

 

其中bin目录中所包含的内容为一些批处理文件,boot目录所包含的内容为Maven的自定义类装载器,conf目录中所包含的内容为Maven的核心配置文件,lib目录中所包含的内容为Maven的类库集合

 

笔者将Maven解压(安装)目录为D:\Program Files\apache-maven-3.0.4\,那么接下来要做的事情就是配置环境变量,由于笔者所使用的操作系统为windows,那么所演示的操作也将基于windows系统。

 

配置Maven的环境变量,你需要增加如下环境变量 :

M2_HOME:D:\Program Files\apache-maven-3.0.4\

Path:%M2_HOME%\bin

 

当成功配置好环境变量后,我们则需要通过如下批处理命令检测是否成功安装Maven:

echo %M2_HOME%:检查Maven的安装目录;

 

mvn -v:查看当前Maven的版本号;

 

 

有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网。这时就需要为Maven配置HTTP代理。你可以在目录~/.m2/setting.xml文件中编辑如下(如果没有该文件,则复制$M2_HOME/conf/setting.xml):

 

 

<proxies>
 <proxy>
  <id>optional</id>
  <active>true</active>
  <protocol>http</protocol>
  <username>proxyuser</username>
  <password>proxypass</password>
  <host>proxy.host.net</host>
  <port>80</port>
  <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
 </proxy>
</proxies>

 

 

 三、构建Maven项目

 

通过Maven构建一个普通的Java项目,你如果不采用m2eclipse插件,则必须配置好Maven的环境变量,否则你将无法完成项目构建。

 

你可以使用如下批处理命令来创建一个基于Maven的普通Java项目: 

 

mvn archetype:generate -DgroupId=com.johngao -DartifactId=my-maven 
-Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart 

  

 

 

使用如上命令则可以成功创建一个基于Maven的普通Java项目,如果是第一次创建,Maven则会从远程中央仓库下载所需依赖类库至缺省的本地仓库中${user.home}/.m2/repository),你所要做的事情仅是等待即可。

 

当成功创建好项目后,项目目录结构大致如下:

my-maven 
|-- pom.xml 
|-- src 
    |-- main  
      |-- java
         |-- com  
             |-- johnago
                 |-- App.java
    |-- test
       |-- java
          |-- com
             |-- johngao
                 |-- AppTest.java

  

 

 

 

 

 

src/main/java : Java源文件存放位置;

src/test/java : 测试代码源文件存放位置;

 

前面章节笔者提到过Maven是基于项目对象模型(POM)的项目管理工具,那么咱么接下来分析下项目工程目录下的POM.xml文件。

该文件的内容为:

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.johngao</groupId>
  <artifactId>my-maven</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0</version>
  <name>my-maven</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

  

 

 其中最重要的3个标签为:<groupId>、<artifactId><version>,这3个标签定义了整个项目的经纬

其中<groupId>标签定义了项目的所属分组(和项目所在的组织或公司关联),比如:org.springframework。而<artifactId>标签则定义了项目所属分组中的最小单位构件,比如:spring-core。<version>标签则定义了项目的版本

 

四、Maven常用命令

 

如果需要执行如下命令,则需要将目录切换至项目路径。

1、mvn clean compile:编译命令;

执行上述命令成功build 后,Maven会在工程目录下新建target目录,该目录将包含所有通过编译的字节码文件。

 

2、mvn clean:清理命令;

执行上述命令将会清除工程目录下的target目录。

 

3、mvn test:测试命令;

执行上述命令则会执行src/test/java 目录下的所有Junit 测试代码,当然执行此命令之前会先执行编译命令。

此命令执行顺序为:mvn clean compile --> mvn test

 

4、mvn package:打包命令;

执行上述命令会将项目打成jar包,并放在target目录中,当然执行此命令之前会先执行编译和测试命令。 package -Dmaven.test.skip=true -Pdev(不打包测试用例)

此命令执行顺序为:mvn clean compile --> mvn test --> mvn package

 

5、mvn install:安装命令;

执行上述命令则会将项目的jar包安装到本地仓库中,以便其他项目调用,当然执行此命令之前会先执行编译,测试,打包等命令。

此命令执行顺序为:mvn clean compile --> mvn test --> mvn package --> mvn install

 

通过执行上面5种常用命令,我们便可以完成一个项目的完整构建。

 

 

五、使用m2eclipse构建Maven项目

 

前面章节笔者已经带大家走进了Maven的世界,那么接下来笔者将会演示如何在eclipse中使用Maven。由于eclipse或myeclipse目前并没有对缺省对Maven进行集成,但这并不妨碍我们在IDE中使用Maven。

 

笔者向大家推荐一种用于在eclipse等IDE工具中建立Maven项目的插件工具,那便是m2eclipse。接下来你将会看到,在eclipse中通过m2eclipse插件管理Maven项目是多么的简单和方便。

 

单击eclipse菜单栏中的Help-->Eclipse Marketplace菜单,进行m2eclipse插件的下载:

 

 

下载的过程可能比较耗费时间,在这段时间之内,你可以有2种选择。第一,你可以选择看会电视或者转发微薄来消磨时光。第二,你可以去泡杯咖啡提提神,为接下来的事情做准备...

当成功下载好m2eclipse后,我们可以先把eclipse重启,然后通过File菜单创建一个Maven项目:

 

 

此操作按照缺省选项进行,请勿手痒勾选其他选项:

 

 

由于目前我们仅是通过Maven创建一个普通的Java项目,而非Web项目,所以大家只需勾选maven-archetype-quickstart选项即可:

 

 

 

接下来我们只需要输入项目的GroupId、ArtifactId、Version和package等选项即可。如果并不清楚GroupId、ArtifactId、Version等属性的作用及目的,请麻烦你先查看前几张的内容。最后我们点击Finish按钮即可成功创建Maven项目。

 

 

创建好的Maven项目工程结构如下:

 

既然通过m2eclipse插件已经成功建立好Maven项目后,接下来要做的事情就是如何使用Maven命令进行项目构建。

 

右击项目,选择你需要执行的命令操作:

 

如果你发现你所需要执行的命令并没有包含在Run As菜单中,大可不必惊慌。我们可以通过手工添加命令的方式来执行Maven命令。假如现在我们需要添加一个mvn package命令,我们可以通过Maven build...(非Maven build)选项进行Maven命令的添加:

 

当命令成功添加好以后,我们便可以在Run As菜单中选择我们所在执行的命令即可:

 

通过m2eclipse插件,我们可以很轻松的在eclipse中进行Maven项目的管理,那么接下来我们尝试着创建一个基于Maven的Web项目,当然这和创建传统的Java项目大同小异,只是有些细节部分需要注意而已。

 

在创建普通Java项目的时候我们Catalog属性选择的是All Catalogs属性,勾选的是maven-archetype-quickstart选项。然而既然我们需要创建Web项目,自然需要稍稍变化一下,Catalog属性我们需要选择Internal,然后勾选maven-archetype-webapp选项即可:

 

创建好的Maven项目工程(Web)结构如下:

 

 

 

右击项目,点击Properties->Project Facets:

 

其实大家除了可以使用eclipse或者myeclipse集成m2eclipse插件来进行Maven的项目管理外,大家还可以尝试使用另一种IDE工具:Spring Tool Suite。该工具仅对eclipse进行了二次开发,缺省就已经集成了Maven,所以大家无需再次手动下载m2eclipse插件(下载地址为:http://www.springsource.org/spring-tool-suite-download):

 

六、基于Maven的依赖管理

 

上述章节笔者已经完全阐述了如何使用Maven来构建你的项目,那么接下来笔者将会给你演示Maven的另一项功能,那便是依赖管理。什么是依赖管理呢?其实所谓依赖管理无非也就是对咱们项目中所使用的第三方类库进行统一的管理(不要告诉笔者你的项目没有任何第三方类库的依赖,当然那只是极少数),笔者说过,不知大家是否还记得,如果你还在为项目中的第三方依赖库发愁,整天想着应该去哪里寻找项目依赖库,或者如何解决依赖库版本冲突问题,或者不想为每一个项目都去建立一个lib文件夹,然后把几十兆甚至上百兆的依赖库做重复的复制和粘贴工作,那么你完全需要一种规范化且高度依赖化的方式来帮助你完成这些令人头痛且纠结的工作,这便是本章节要讲解的重点

 

假设咱们现在启动的项目依赖于Spring这个中间件,那么可能会用到Spring的spring-core-xx.jar,按照一般情况,咱们肯定会先去Spring的官网下载Spring的类库,然后通过手工的方式导入项目lib中,但这种手工的情况太麻烦,而且咱们还需要导入spring-core-xx.jar依赖的其他第三方类库。笔者敢问有谁能够记得住这些包预包之间的依赖???没有人吧,那么就耐心的看Maven如何管理依赖。

 

仔细观察如下POM.xml文件:

 

 

上述红色部分为依赖配置,也就是说基于Maven项目的类库依赖配置都可以通过<dependencies>标签完成。该标签中包含了:<groupId>、<artifactId><version>等3个标签,前面章节中,笔者给大家提到过,这3个标签共同组成了项目的经纬所以这3个属性是至关重要的。

 

假设咱们现在需要使用到spring-core.xx.jar包,咱们只需要在<dependencies>标签中后续定义即可,Maven会自动从中央仓库进行对应版本的依赖库下载至本地仓库中(无私服情况下),然后通过引用的方式加载至项目中,比如:

 

 

按照一般情况来说,我们一旦导入spring-core.xx.jar包,我们仍需要将该包依赖的其他第三方类库共同导入的,但Maven这时便能够体现出他的作用,仔细看下图:

 

 

基于Maven的依赖管理后,spring-core.xx.jar所需要的其他依赖库已经成功下载至本地仓库中一起被项目引用。

 

果你项目中存在其他依赖包也同样可以按照上述做法,但笔者需要提醒你的是,项目的经纬是至关重要的,如果你并没有正确定义依赖类库的经纬,Maven是无法进行下载的。

而且在后续章节中,笔者同时也会告诉你如何将定义好经纬的项目发布至私服环境中,

以及如何提供给其他项目下载至本地仓库。

 

Maven3.x的使用就基本告一段落,但本文相关系类并不会就此结束,希望大家密切留意关于如何搭建内网私服。

8
8
分享到:
评论
17 楼 dbwang 2013-03-05  
文章写得挺好,逻辑性也比较强,现在已经渐渐的适应了maven。刚开始的确还有些打处
16 楼 gao_xianglong 2013-01-15  
为什么我创建的web项目没有WebContent文件夹,我已经选择了Internal选项和maven-archetype-webapp。WebContent目录需要手动添加吗
sixeven 写道
大哥,为什么我创建的web项目没有WebContent文件夹,我已经选择了Internal选项和maven-archetype-webapp。WebContent目录需要手动添加吗


请把你的视图从J2SE切换到J2EE好吗?
15 楼 sixeven 2013-01-15  
大哥,为什么我创建的web项目没有WebContent文件夹,我已经选择了Internal选项和maven-archetype-webapp。WebContent目录需要手动添加吗
14 楼 gao_xianglong 2012-11-20  
chenlei1728 写道
现在关于Maven的文章越来越多了,证明Maven正在被越来越多的人接受和使用,但是有点遗憾的是,这个时间有点长。


呵呵, 不管如何,项目适合就行,不适合可以选用别的管理工具。
13 楼 chenlei1728 2012-11-20  
现在关于Maven的文章越来越多了,证明Maven正在被越来越多的人接受和使用,但是有点遗憾的是,这个时间有点长。
12 楼 endisonlai 2012-11-20  
写的很好,mark
11 楼 zys0523 2012-11-19  
写的很好,不过spring已经不用maven管理了
10 楼 yuky1327 2012-11-19  
maven 支持java eclipse myeclipse集成开发代码。
ant和maven,在我看来,ant写起来反而比maven繁琐,注意的细节要多。
看懂demo,maven思想,然后应用到目前项目,应该可以的。
9 楼 gao_xianglong 2012-11-19  
lianglaiyang 写道
我很想用上这个,但有两点需要请教一下
1、目前在用项目可以改成maven吗?如何改?、
2、现在我们都习惯于用myeclipse以及eclipse等工具,想放弃是不太可能,怎么跟Maven集成工作?


1、首先Maven是极度灵活和自由的,你可以新建一个Maven项目,或者是将以前非Maven的项目更新为Maven项目,如果是更新的话,你可以参考本文的Maven工程目录定义,主要是POM.xml的定义;

2、无论是Eclipse还是MyEclipse等IDE工具目前均有支持Maven的IDE插件(m2eclipse),下节本文将会讲解如何通过使用IDE的方式来建立和管理Maven项目;
PS:对Eclipse二次开发的Spring Tool Suite工具已经集成有Maven插件;
8 楼 lianglaiyang 2012-11-19  
我很想用上这个,但有两点需要请教一下
1、目前在用项目可以改成maven吗?如何改?、
2、现在我们都习惯于用myeclipse以及eclipse等工具,想放弃是不太可能,怎么跟Maven集成工作?
7 楼 manolo 2012-11-19  
可以試試gradle啊
6 楼 hmpop 2012-11-19  
superchinaren 写道
hmpop 写道
大哥,实在忍不住了,先不说您的内容了,最起马不要把字体搞哪么小嘛,考我眼力么??基本的排版还是注意一点嘛。

你不知道把网页放大一点看吗。。。

这什么逻辑??哎,我白说了,看来大家都习惯不被尊重了。
5 楼 chenlei1728 2012-11-19  
希望下篇更精彩!
4 楼 sjhnanwang 2012-11-19  
老大来学习了
3 楼 yuky1327 2012-11-19  
...现在我开发的项目都习惯用maven管理,其实不难理解.
快速创建maven项目:
普通的Java项目,如基础包等:
   mvn archetype:create   -DgroupId=com.yourcompany  -DartifactId=myproject  -DarchetypeArtifactId=maven-archetype-quickstart
普通的Web项目,如一个Web项目:
    mvn archetype:create  -DgroupId=com.yourcompany -DartifactId=myproject  -DarchetypeArtifactId=maven-archetype-webapp

编译时跳过单元测试
mvn clean install -Dmaven.test.skip=true

创建支持eclipse的多模块maven项目
创建总的POM

mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=multi-modules-demo

创建一个maven项目,然后修改该项目的pom.xml文件,package类型改为pom:

<packaging>pom</packaging>

并且删除src目录。

创建子模块

在总模块目录下,创建子模块,比如web-demo:

mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=web-demo

再创建一个比如日志模块:

mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=logging-demo
2 楼 superchinaren 2012-11-19  
hmpop 写道
大哥,实在忍不住了,先不说您的内容了,最起马不要把字体搞哪么小嘛,考我眼力么??基本的排版还是注意一点嘛。

你不知道把网页放大一点看吗。。。
1 楼 hmpop 2012-11-19  
大哥,实在忍不住了,先不说您的内容了,最起马不要把字体搞哪么小嘛,考我眼力么??基本的排版还是注意一点嘛。

相关推荐

    Android代码-Android-Camera2-Library

    compile 'me.aflak.libraries:ezcam:X.X' Or if you use Maven : me.aflak.libraries ezcam X.X pom TextureView Important : The TextureView must be in a FrameLayout. Initialize EZCam cam = new ...

    Android代码-SmoothProgressBar

    Description Small library allowing you to make a smooth indeterminate progress bar. You can either user your progress bars and set this drawable or use directly the ... // of course, do not write x.x.

    Android代码-GroupOfX

    Create and use Group.OfX (where X ∈ {Two, Three, Four, ..., Ten}) just like you would a Pair object. Group.OfFour aGroupOfFour = new Group.OfFour("first part", 2, "third", "and a fourth one."); ...

    Android代码-支持计数效果的 FloatingActionButton

    CounterFab A FloatingActionButton subclass that shows a counter badge... x.y.z pom Usage Add it as a regular FloatingActionButton on layout… and programmatically you can use one of these methods: Cou

    Android代码-webbit

    Getting it ... On OS-X and Linux this should work out of the box. On Solaris, use gmake. On Windows you will need Cygwin. make Maven mvn install Quick start Start a web server on port 8080 and

    .Advanced.Java.EE.Development.with.WildFly.1783288906

    Discover how to use EJB 3.x, JSF 2.x, Ajax, JAX-RS, JAX-WS, and Spring with WildFly 8.1 A practical guide filled with easy-to-understand programming examples to help you gain hands-on experience with ...

    Advanced.Java.EE.Development.with.WildFly.1783288906

    Discover how to use EJB 3.x, JSF 2.x, Ajax, JAX-RS, JAX-WS, and Spring with WildFly 8.1 A practical guide filled with easy-to-understand programming examples to help you gain hands-on experience with ...

    iText 7 Community版

    Git上下载的PDF开发工具(Java),目前是最新版本。The iText 7 Core/Community release contains: kernel-x.y.z.jar: low-level ...sign-x.y.z.jar: use this if you need support for digital signatures

    spring-boot-reference.pdf

    24.6.3. Multi-profile YAML Documents 24.6.4. YAML Shortcomings 24.7. Type-safe Configuration Properties 24.7.1. Third-party Configuration 24.7.2. Relaxed Binding 24.7.3. Merging Complex Types 24.7.4. ...

    apbot:一个完美的机器人

    管理员 舞台 ====== 一个完美的机器人基本功能工作要求您已正确安装和配置git(显然) maven,最好的 maven 3.x java,版本8左右...... 1 查看代码即 git clone 2 输入您检出的目录是 pom.xml 是3 构建即 mvn 包4 ...

    Eclipse 4 Plug-in Development by Example: Beginner's Guide

    How to develop, build, test, package, and release Eclipse plug-ins with features for Eclipse 3.x and Eclipse 4.x Overview Create plug-ins to extend the Eclipse runtime covering Eclipse 3.x and the ...

    autorest.java:AutoRest扩展(https:github.comAzureautorest),生成Java代码

    先决条件您需要在计算机上安装以下组件: Node.JS v10.x-v13.x Java 8+ Maven的3.x 您需要通过NPM安装 : npm i -g autorest用法要使用最新发布的预览版( ),请运行autorest --java --use:@autorest/java@4.0.x --...

    jackson-databind:用于Jackson(2.x)的常规数据绑定程序包:适用于流API(核心)实现

    总览 该项目包含用于的通用数据绑定功能和树模型。...-- Use the latest version whenever possible. --&gt; &lt; jackson&gt;2.12.0 ... ... &lt; groupId&gt;com.fasterxml.jackson.core&lt;/ groupId&gt; &lt; ar

    javacv-platform-1.3.3-src

    视频人脸识别,取代jmf。... CvMat randomR = CvMat.create(3, 3), randomAxis = CvMat.create(3, 1); // We can easily and efficiently access the elements of matrices and images // through an Indexer ...

    Android代码-RxAssetManager

    Use the jcenter() or mavenCentral() repository. repositories { jcenter() mavenCentral() } Then pick a module. Core dependencies { implementation ...

    mysqlconnector8.0.20.zip

    Maven repository and add it to the CLASSPATH, or use Maven's automatic dependency resolution features by adding a dependency to "GroupId: mysql" and "ArtifactId: mysql-connector-java" to your ...

    mysql-connector-java-8.0.21.jar

    Maven repository and add it to the CLASSPATH, or use Maven's automatic dependency resolution features by adding a dependency to "GroupId: mysql" and "ArtifactId: mysql-connector-java" to your ...

    Android代码-DisqusSDK-Android

    This library implements the Disqus API for use in Android applications. This librar is ongoing Gradle settings repositories { maven { url 'https://dl.bintray.com/jjhesk/maven' } } dependencies { ...

    thymeleaf-extras-springsecurity-3.0-master.zip

    thymeleaf-extras-springsecurity3 for integration with Spring Security 3.x thymeleaf-extras-springsecurity4 for integration with Spring Security 4.x Current versions: Version 3.0.2.RELEASE - for ...

    thymeleaf-tests-3.0-spring5.zip

    Tests under the org.thymeleaf.engine package are designed for use with the thymeleaf-testing library. All tests and are launched using JUnit. The JUnit test classes are contained at several folders, ...

Global site tag (gtag.js) - Google Analytics