最近由于公司项目需要,学习了一下Maven 环境的配置。这里把配置步骤和简单的操作做一个汇总。

一、Maven环境的搭建

1、配置java环境(这里不详述过程,可参考:http://www.cnblogs.com/Belieflee/p/4778315.html)

java 环境配置好后,在命令行中输入java -version ,配置成功如下图所示:

2、下载Maven安装包

下载地址:http://maven.apache.org/download.cgi

3、Maven安装配置

a、安装Maven

将下载好的Maven安装包解压。解压的路径为E:\java\apache-maven-3.5.0

b、配置环境变量

右键计算机-属性-高级系统设置-系统环境变量

新建 MAVEN_HOME : E:\java\apache-maven-3.5.0,在PATH后添加 %MAVEN_HOME%\bin。

还有一个可选的环境变量MAVEN_OPTS,该环境变量主要是配置Maven在使用jdk的时候指定JVM属性的。如指定其值为“-Xms256m -Xmx512m”

在命令窗口使用mvn -v来验证一下Maven是否安装成功在命令窗口使用mvn -v来验证一下Maven是否安装成功

4、首次运行完mvn -version后,会在用户目录下创建一个.m2的目录(比如:C:\Users\当前用户名\.m2\),这个目录是maven的“本地仓库”,仓库是maven中一个很重要的概念。

试想一下,我们会在工作中同时创建很多项目,每个项目可能都会引用一些公用的jar包(.NET中是dll文件),一种作法是每个项目里,都复制一份这些依赖的jar包(或dll文件),这样显然不好,相同的文件在硬盘上保存了多份,太占用空间,而且这些依赖的jar包(或dll文件)的版本也不太好管理(比如某个公用的jar包,从1.0升级到2.0,如果所有引用这个jar包的项目都需要更新,必须一个个项目的修改)。

maven的仓库则很好的解决了这些问题,它在每台机器上创建一个本机仓库,把本机上所有maven项目依赖的jar包统一管理起来,而且这些jar包用“坐标”来唯一标识(注:坐标是另一个重要的概念,后面还会讲到,这里只要简单理解成“唯一识别某个jar包文件名、版本号”的标识即可),这样所有maven项目就不需要再象以前那样把jar包复制到lib目录中,整个maven项目看起来十分清爽。

5、配置Maven环境

在Maven中提供了一个settings.xml文件来定义Maven的全局环境信息。这个文件会存在于Maven的安装目录的conf子目录下面,或者是用户家目录的.m2子目录下面。我们可以通过这个文件来定义本地仓库、远程仓库和联网使用的代理信息等。

其实相对于多用户的PC机而言,在Maven安装目录的conf子目录下面的settings.xml才是真正的全局的配置。而用户家目录的.m2子目录下面的settings.xml的配置只是针对当前用户的。当这两个文件同时存在的时候,那么对于相同的配置信息用户家目录下面的settings.xml中定义的会覆盖Maven安装目录下面的settings.xml中的定义。用户家目录下的settings.xml文件一般是不存在的,但是Maven允许我们在这里定义我们自己的settings.xml,如果需要在这里定义我们自己的settings.xml的时候就可以把Maven安装目录下面的settings.xml文件拷贝到用户家目录的.m2目录下,然后改成自己想要的样子。

先来看一个基本的settings.xml的样子:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. <localRepository>/path/to/local/repo</localRepository>
  6. <interactiveMode>true</interactiveMode>
  7. <offline>false</offline>
  8. <pluginGroups>
  9. </pluginGroups>
  10. <proxies>
  11. <proxy>
  12. <id>optional</id>
  13. <active>true</active>
  14. <protocol>http</protocol>
  15. <username>proxyuser</username>
  16. <password>proxypass</password>
  17. <host>proxy.host.net</host>
  18. <port>80</port>
  19. <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
  20. </proxy>
  21. </proxies>
  22. <servers>
  23. <server>
  24. <id>deploymentRepo</id>
  25. <username>repouser</username>
  26. <password>repopwd</password>
  27. </server>
  28. </server>
  29. <mirrors>
  30. <mirror>
  31. <id>mirrorId</id>
  32. <mirrorOf>repositoryId</mirrorOf>
  33. <name>Human Readable Name for this Mirror.</name>
  34. <url>http://my.repository.com/repo/path</url>
  35. </mirror>
  36. </mirrors>
  37. <profiles>
  38. <profile>
  39. <id>jdk-1.4</id>
  40. <activation>
  41. <jdk>1.4</jdk>
  42. </activation>
  43. <repositories>
  44. <repository>
  45. <id>jdk14</id>
  46. <name>Repository for JDK 1.4 builds</name>
  47. <url>http://www.myhost.com/maven/jdk14</url>
  48. <layout>default</layout>
  49. <snapshotPolicy>always</snapshotPolicy>
  50. </repository>
  51. </repositories>
  52. </profile>
  53. </profiles>
  54. <activeProfiles>
  55. <activeProfile>alwaysActiveProfile</activeProfile>
  56. <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  57. </activeProfiles>
  58. </settings>

settings.xml中主要包括以下元素:

localRepository:表示Maven用来在本地储存信息的本地仓库的目录。默认是用户家目录下面的.m2/repository目录。

  1. <localRepository>/path/to/local/repo</localRepository>

interactiveMode:表示是否使用交互模式,默认是true;如果设为false,那么当Maven需要用户进行输入的时候,它会使用一个默认值。

  1. <interactiveMode>true</interactiveMode>

offline:表示是否离线,默认是false。这个属性表示在Maven进行项目编译和部署等操作时是否允许Maven进行联网来下载所需要的信息。

  1. <offline>false</offline>

pluginGroups:在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。pluginGroup元素指定的是plugin的groupId。默认情况下,Maven会自动把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。

  1. <pluginGroups> </pluginGroups>

proxies:其下面可以定义一系列的proxy子元素,表示Maven在进行联网时需要使用到的代理。当设置了多个代理的时候第一个标记active为true的代理将会被使用。

  1. <proxies>
  2. <proxy>
  3. <id>optional</id>
  4. <active>true</active>
  5. <protocol>http</protocol>
  6. <username>proxyuser</username>
  7. <password>proxypass</password>
  8. <host>proxy.host.net</host>
  9. <port>80</port>
  10. <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
  11. </proxy>
  12. </proxies>

servers:其下面可以定义一系列的server子元素,表示当需要连接到一个远程服务器的时候需要使用到的验证方式。这主要有username/password和privateKey/passphrase这两种方式。

  1. <servers>
  2. <server>
  3. <id>deploymentRepo</id>
  4. <username>repouser</username>
  5. <password>repopwd</password>
  6. </server>
  7. </server>

mirrors:用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一个repositoryId。

  1. <mirrors>
  2. <mirror>
  3. <id>mirrorId</id>
  4. <mirrorOf>repositoryId</mirrorOf>
  5. <name>Human Readable Name for this Mirror.</name>
  6. <url>http://my.repository.com/repo/path</url>
  7. </mirror>
  8. </mirrors>

l  id:是用来区别mirror的,所有的mirror不能有相同的id

l  mirrorOf:用来表示该mirror是关联的哪一个仓库,其值为其关联仓库的id。当要同时关联多个仓库时,这多个仓库之间可以用逗号隔开;当要关联所有的仓库时,可以使用“*”表示;当要关联除某一个仓库以外的其他所有仓库时,可以表示为“*,!repositoryId”;当要关联不是localhost或用file请求的仓库时,可以表示为“external:*”。

l  url:表示该镜像的url。当Maven在建立系统的时候就会使用这个url来连接到我们的远程仓库。

profiles:用于指定一系列的profile。profile元素由activation、repositories、pluginRepositories和properties四个元素组成。当一个profile在settings.xml中是处于活动状态并且在pom.xml中定义了一个相同id的profile时,settings.xml中的profile会覆盖pom.xml中的profile。

  1. <profiles>
  2. <profile>
  3. <id>jdk-1.4</id>
  4. <activation>
  5. <jdk>1.4</jdk>
  6. </activation>
  7. <repositories>
  8. <repository>
  9. <id>jdk14</id>
  10. <name>Repository for JDK 1.4 builds</name>
  11. <url>http://www.myhost.com/maven/jdk14</url>
  12. <layout>default</layout>
  13. <snapshotPolicy>always</snapshotPolicy>
  14. </repository>
  15. </repositories>
  16. t;/profile>
  17. </profiles>

activation:这是profile中最重要的元素。跟pom.xml中的profile一样,settings.xml中的profile也可以在特定环境下改变一些值,而这些环境是通过activation元素来指定的。

在上面这段代码中,当所有的约束条件都满足的时候就会激活这个profile。

jdk:表示当jdk的版本满足条件的时候激活,在这里是1.4。这里的版本还可以用一个范围来表示,如

<jdk>[1.4,1.7]</jdk>表示1.4、1.5、1.6和1.7满足;

activeProfiles:底包含一系列的activeProfile元素,表示对于所有的pom都处于活跃状态的profile。

    1. <activeProfiles>
    2. <activeProfile>alwaysActiveProfile</activeProfile>
    3. <activeProfile>anotherAlwaysActiveProfile</activeProfile>
    4. </activeProfiles>

二、Maven使用入门

到目前为止,已经大概安装好了Maven,现在开始创建一个最简单的Hello World项目。

1.创建项目

在命令行输入:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Dversion=1.0

回车,如图:

执行Maven命令(goal)archetype:generate,并且设置了一些参数

( -DgroupId=com.mycompany.app -DartifactId=my-app -Dversion=1.0) 
【mvn archetype:generate 创建maven项目;

-DgroupId=com.mycompany.app组ID;

-DartifactId=my-app项目名称

-Dversion=1.0版本】

如果你是首次运行该命令(goal),maven将要花一些时间从maven库去把最新的工具包(Maven把它叫作artifacts)下载到你的本地仓库(local repository)中,所以这个时候需要Internet连接。Maven默认的本地库是%USER_HOME%\.m2\repository\,比如我的本地库路径为:C:\User\fulei\.m2\repository\。

命令执行完后你将看到maven生成了一个名为my-app的目录,这个名字就是你在命令中指定的artifactId,进入该目录,你将发现以下标准的项目结构:

其中:src/main/java 目录包含了项目的源代码,src/test/java 目录包含了项目的测试代码,pom.xml是项目的项目对象模型(Project Object Model or POM)。

 

2.POM代码介绍

就像Make的Makefile、Ant的build.xml一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。下面列出这个POM的内容:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.mycompany.app</groupId>
  5. <artifactId>my-app</artifactId>
  6. <version>1.0</version>
  7. <packaging>jar</packaging>
  8. <name>my-app</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>3.8.1</version>
  18. <scope>test</scope>
  19. </dependency>
  20. </dependencies>
  21. </project>

代码第一行是XML头,指定了该xml文档的版本和编码方式。紧接着是project元素,project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但是用这些属性能够让第三方工具能够快速编辑POM。

根元素的第一个元素modelVersion指定了当前POM模型的版本,对于Maven2及Maven3来说,它只能是4.0.0。

这段代码中最重要的是groupID、artifactID和version的三行。这三个元素定义了一个项目基本的坐标,在Maven项目中,任何的jar、pom或者version都是以基于这些基本的坐标进行区分的。

groupID定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。比如在googlecode上建立了一个myapp的项目,那么groupID就是com.googlecode.myapp。

· 简而言之:

· modelVersion: 这个XML文件所使用的POM格式的版本

· groupId: 相当于这个project的所有者或者机构的一个标识,一般是com.company.xxx这种格式

· artifactId: 这个project最后所生成的文档(jar、war)的名字,比如对于junit这个开源的project,它的artifactId就是junit

· packaging: 这个project的打包的类型,一般是war、jar等值

· version: project的版本

· name: project的名字,生成文档等内容的时候会用的这个名字

 

3.主代码

项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(如jar),而测试代码只在运行测试时用到,不会被打包。默认情况下,Maven项目主代码位于src/main/java目录,所以在该目录下创建文件com/mycompany/app/App.java,其代码内容如下:

  1. package com.mycompany.app;
  2. /**
  3. * Hello world!
  4. */
  5. public class App
  6. {
  7. public static void main( String[] args )
  8. {
  9. System.out.println( "Hello World!" );
  10. }
  11. }

关于Java代码有两点需要注意。首先,在绝大多数情况下,应该把项目主代码放到src/main/java目录下(遵循Maven的约定),而无须额外的配置,Maven会自动搜寻该目录找到项目主代码,其次,该Java类的包命是com.mycompany.app

这与POM中定义的groupID和artifactID相吻合,项目中Java类的包都应该基于项目的groupID和artifactID,这样更加清晰,更加符合逻辑,也可以方便搜索构件或Java类。

 

4.编译

使用Maven进行编译,在项目根目录下运行命令mvn clean compile,会得到如下输出:

clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码,从输出中看到Maven实现执行了clean:clean任务,删除target/目录。默认情况下,Maven构建的所有输出都在target/目录中;接着执行resources:resources任务(未定义项目资源,暂时略过);之后执行compile:compile任务,将项目主代码编译至target/classes目录(编译好的类为com/mycompany/app/App.class)

 

5.测试

主代码与测试代码分别位于独立的目录中,Maven项目中的默认的测试代码了目录为src/test/java。

在Java世界中,JUnit是事实上的单元测试标准,要使用JUnit,要为项目添加JUnit依赖,项目POM代码中:

  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>3.8.1</version>
  6. <scope>test</scope>
  7. </dependency>
  8. </dependencies>

代码中有dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖,这里添加了一个依赖--groupID是junit,artifactID是junit,version是3.8.1,有了这段声明,Maven就能够自动下载junit-3.8.1.jar。有了Maven,它会自动访问中央仓库,下载需要的文件。也可以自己访问该仓库,打卡路径junit/junit/3.8.1/,就能看到junit-3.8.1pom和junit-3.8.1.jar。

上述POM代码中还有一个值为test的元素scope,scope为依赖范围,若依赖范围为test则表示该依赖只对测试有效。换句话说,测试代码中的import JUnit代码是没有问题的,但是如果在主代码中用import JUnit代码,就会对造成编译错误。如果不声明依赖范围,那么默认值就是compile,表示该依赖对主代码和测试代码都有效。

打开测试用例代码,在src/test/java目录下的AppTest.java,代码如下:

  1. package com.mycompany.app;
  2. import junit.framework.Test;
  3. import junit.framework.TestCase;
  4. import junit.framework.TestSuite;
  5. /**
  6. * Unit test for simple App.
  7. */
  8. public class AppTest
  9. extends TestCase
  10. {
  11. /**
  12. * Create the test case
  13. *
  14. * @param testName name of the test case
  15. */
  16. public AppTest( String testName )
  17. {
  18. super( testName );
  19. }
  20. /**
  21. * @return the suite of tests being tested
  22. */
  23. public static Test suite()
  24. {
  25. return new TestSuite( AppTest.class );
  26. }
  27. /**
  28. Rigourous Test :-)
  29. */
  30. public void testApp()
  31. {
  32. assertTrue( true );
  33. }
  34. }

调用Maven执行测试,运行mvn clean test,如图:

 

测试代码通过编译后在target/test-classes下生成了二进制文件,紧接着surefire:test任务运行测试,surefire是Maven中负责执行测试的插件,这里它运行测试用例AppTest,并输出测试报告,显示一共运行了多少测试,失败了多少,出错了多少,跳过了多少。显然,测试通过了。

6.打包

在命令行上输入:cd my-app回车,进入到项目路径下,再输入mvn package回车这时命令行将会打印出各种动作,并且以下面一段信息结束,如图:

此时,maven在my-app下面建立了一个新的目录target/,构建打包后的jar文件my-app-1.0.jar就存放在这个目录下。编译后的class文件放在target/classes/目录下面,测试class文件放在target/test-classes/目录下面。

7.运行

执行下面的命令:

java -cp target/my-app-1.0.jar com.mycompany.app.App,结果如图:

至此,我们得到了项目的输出。

8.安装JAR包

如果需要的话,可以复制这个jar文件到其他项目的Classpath中从而使用my-app类。还需要一个安装的步骤,执行mvn clean install:

在打包之后,有执行了安装任务install:install。从输出可以看到该任务将项目输出的jar安装到了Maven本地仓库中,可以打开相应的文件夹看到my-app项目的pom和jar。我们说只有将构件下载到本地仓库中,才能由所有Maven项目使用。

到这里就说完了创建,编译,测试,打包以及安装,大部分的项目也就是做这些事情。

Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。

Maven有一套build的生命周期,是按照一套顺序走下来的,这一套顺序就叫一个生命周期(lifecycle)。一个生命周期分为多个阶段(build phase),每一个build phase是由目标(goal)组成的,一个goal其实就是一个任务,目标可以绑定到生命周期阶段上。一个生命周期阶段可以绑定多个插件目标。当maven在构建过程中逐步的通过每个阶段时,会执行该阶段所有的插件目标。比如执行打包命令:

mvn package时,会先执行compile,再执行test,最后才是package打包。

参考:http://blog.csdn.net/xuexiaoxu1990/article/details/52882664

最新文章

  1. iOS通知
  2. Ubuntu 16.04安装搜狗输入法
  3. Centos 7 ASP.NET Core 1.0 Docker部署
  4. Codeforces Round #263 (Div. 1)
  5. python学习之路-day2-pyth基础2
  6. 实例化bean的三种方式
  7. 查看帮助文档的一些方法:help,dir,type,func_global等
  8. java实现简单的文件筛选
  9. java实现二维码生成的几个方法
  10. 一种H.264高清视频的无参考视频质量评价算法(基于QP和跳过宏块数)
  11. java多线程12设计模式
  12. MongoDB数据模型(三)
  13. ios 做的一个三个数求平均数 最大数 最小数
  14. linux svn up 中文显示乱码解决办法
  15. 2018-2019-2 20165205 网络攻防Exp3免杀原理与实践
  16. 开机出现grub界面(待尝试)
  17. LeetCode--342--4的幂
  18. Mybatis七(MBG 逆向工程)
  19. php cli命令 自定义参数传递
  20. JS获取用户的Ip地址

热门文章

  1. 从零搭建java后台管理系统(二)mysql和redis安装
  2. Typescript 学习笔记二:数据类型
  3. SGD vs Momentum vs NAG vs Adagrad vs Adadelta vs RMSprop vs Adam
  4. 文本转音频(百度语音合成api)(python)(原创)
  5. C# DataGridview控件自动下拉到最后一行
  6. Set &quot;$USE_DEPRECATED_NDK=true&quot; in gradle.properties to continue using the current NDK integration. 解决办法
  7. 独享锁 &amp; 共享锁
  8. 【Shell实战】批量在多台服务器上执行命令
  9. 获取多个checkbox的选中值
  10. 5分钟开发一个简单的基于HTML5的移动应用