Windows7下Maven环境搭建及其使用

Posted Fantasy_99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows7下Maven环境搭建及其使用相关的知识,希望对你有一定的参考价值。

1.软件下载

1.下载JDK

技术分享图片

下载的安装包为jdk-8u101-windows-x64.exe

 

2.下载Maven

 

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

下载的是最新版本apache-maven-3.3.9-bin.zip

注:安装Maven3.3需要提前安装好JDK 1.7以上版本

 

2.JDK安装配置

1.安装JDK

双击安装包,点击下一步,如图:

技术分享图片

点击更改选择JDK安装的目录后(这个很重要,记住安装路径),点击下一 步,完成JDK的安装。

这个时候,就在安装JDK了。等出现下图,表示JDK安装成功:

技术分享图片
 
 

2.配置JDK

右击计算机,选择属性->高级系统设置->环境变量,点击系统变量的新建按钮。变量名为JAVA_HOME,变量值为你安装JDK时的路径,我当时安装在C盘下,所以变量值就为[C:\Program Files\Java\jdk1.8.0_101],配置完成后点击确定。

技术分享图片

在系统变量中找到Path后,在变量值最后加上:[%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;]   如图:

技术分享图片

完成后点击确定按钮,点击系统变量的新建按钮,变量名为CLASSPATH,变量值为[.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar]    如图:

技术分享图片
 

以上就完成了JDK的安装与配置,下面来测试安装是否成功,开始-运行-cmd进入命令框,在命令框中输入Java -version,出现下图表示安装成功!

技术分享图片

3.Maven安装配置

【必须先下载并安装JDK,配置JDK的环境变量JAVA_HOME,否则maven无法使用eclipse安装maven插件后必须重新定位maven到本地maven目录】

1.安装Maven 

将下载好的Maven安装包解压到磁盘中,我解压的路径为D:\apache-maven-3.3.9

配置环境变量 
   MAVEN_HOME : D:\apache-maven-3.3.9
   MAVEN : %MAVEN_HOME%\bin 
  (可选) MAVEN_OPTS : -Xms256m -Xmx512m 

右击计算机,选择属性->高级系统设置->环境变量,点击系统变量的新建按钮。添加新的系统环境变量MAVEN_HOME,设置其值为刚才解压的maven路径:[D:\apache-maven-3.3.9],如图:

技术分享图片
 

配置系统的path变量,在其尾部加添加[;%MAVEN_HOME%\bin;],如图:

技术分享图片

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

 

接下来我们可以在命令窗口使用mvn -v来验证一下Maven是否安装成功。如能正确输出Maven的安装版本,则表示它安装成功了,如图:

技术分享图片
 

2.理解“仓库”概念

 

  首次运行完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项目看起来十分清爽。

 

3.配置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的样子:

 

[html] view plain copy
 
  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目录。

[html] view plain copy
 
  1. <localRepository>/path/to/local/repo</localRepository>  

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

[html] view plain copy
 
  1. <interactiveMode>true</interactiveMode>  

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

 

[html] view plain copy
 
  1. <offline>false</offline>  

 

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

[html] view plain copy
 
  1. <pluginGroups</pluginGroups>  

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

[html] view plain copy
 
  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这两种方式。

[html] view plain copy
 
  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。

[html] view plain copy
 
  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。

[html] view plain copy
 
  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。

[html] view plain copy
 
  1. <activeProfiles>  
  2.   <activeProfile>alwaysActiveProfile</activeProfile>  
  3.   <activeProfile>anotherAlwaysActiveProfile</activeProfile>  
  4. </activeProfiles>  

4.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的内容:

[html] view plain copy
 
  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.   
  5.   <groupId>com.mycompany.app</groupId>  
  6.   <artifactId>my-app</artifactId>  
  7.   <version>1.0</version>  
  8.   <packaging>jar</packaging>  
  9.   
  10.   <name>my-app</name>  
  11.   <url>http://maven.apache.org</url>  
  12.   
  13.   <properties>  
  14.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  15.   </properties>  
  16.   
  17.   <dependencies>  
  18.     <dependency>  
  19.       <groupId>junit</groupId>  
  20.       <artifactId>junit</artifactId>  
  21.       <version>3.8.1</version>  
  22.       <scope>test</scope>  
  23.     </dependency>  
  24.   </dependencies>  
  25. </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,其代码内容如下:

[java] view plain copy
 
  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代码中:

[html] view plain copy
 
  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,代码如下:

[java] view plain copy
 
  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打包。


好了,maven的核心概念就简单的介绍到这里。









以上是关于Windows7下Maven环境搭建及其使用的主要内容,如果未能解决你的问题,请参考以下文章

centos7下Maven Java selenium3环境搭建

maven环境搭建

利用Maven搭建Spring开发环境

利用Maven搭建Spring开发环境

利用Maven搭建Spring开发环境

Docker环境下使用docker-compose一键式搭建RocketMQ(4.5.0版本)集群及其管理工具