Maven 环境搭建及使用(win10)
最近由于公司项目需要,学习了一下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的样子:
- <?xml version="1.0" encoding="UTF-8"?>
- <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
- <localRepository>/path/to/local/repo</localRepository>
- <interactiveMode>true</interactiveMode>
- <offline>false</offline>
- <pluginGroups>
- </pluginGroups>
- <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>
- <servers>
- <server>
- <id>deploymentRepo</id>
- <username>repouser</username>
- <password>repopwd</password>
- </server>
- </server>
- <mirrors>
- <mirror>
- <id>mirrorId</id>
- <mirrorOf>repositoryId</mirrorOf>
- <name>Human Readable Name for this Mirror.</name>
- <url>http://my.repository.com/repo/path</url>
- </mirror>
- </mirrors>
- <profiles>
- <profile>
- <id>jdk-1.4</id>
- <activation>
- <jdk>1.4</jdk>
- </activation>
- <repositories>
- <repository>
- <id>jdk14</id>
- <name>Repository for JDK 1.4 builds</name>
- <url>http://www.myhost.com/maven/jdk14</url>
- <layout>default</layout>
- <snapshotPolicy>always</snapshotPolicy>
- </repository>
- </repositories>
- </profile>
- </profiles>
- <activeProfiles>
- <activeProfile>alwaysActiveProfile</activeProfile>
- <activeProfile>anotherAlwaysActiveProfile</activeProfile>
- </activeProfiles>
- </settings>
settings.xml中主要包括以下元素:
localRepository:表示Maven用来在本地储存信息的本地仓库的目录。默认是用户家目录下面的.m2/repository目录。
- <localRepository>/path/to/local/repo</localRepository>
interactiveMode:表示是否使用交互模式,默认是true;如果设为false,那么当Maven需要用户进行输入的时候,它会使用一个默认值。
- <interactiveMode>true</interactiveMode>
offline:表示是否离线,默认是false。这个属性表示在Maven进行项目编译和部署等操作时是否允许Maven进行联网来下载所需要的信息。
- <offline>false</offline>
pluginGroups:在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。pluginGroup元素指定的是plugin的groupId。默认情况下,Maven会自动把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。
- <pluginGroups> </pluginGroups>
proxies:其下面可以定义一系列的proxy子元素,表示Maven在进行联网时需要使用到的代理。当设置了多个代理的时候第一个标记active为true的代理将会被使用。
- <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>
servers:其下面可以定义一系列的server子元素,表示当需要连接到一个远程服务器的时候需要使用到的验证方式。这主要有username/password和privateKey/passphrase这两种方式。
- <servers>
- <server>
- <id>deploymentRepo</id>
- <username>repouser</username>
- <password>repopwd</password>
- </server>
- </server>
mirrors:用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一个repositoryId。
- <mirrors>
- <mirror>
- <id>mirrorId</id>
- <mirrorOf>repositoryId</mirrorOf>
- <name>Human Readable Name for this Mirror.</name>
- <url>http://my.repository.com/repo/path</url>
- </mirror>
- </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。
- <profiles>
- <profile>
- <id>jdk-1.4</id>
- <activation>
- <jdk>1.4</jdk>
- </activation>
- <repositories>
- <repository>
- <id>jdk14</id>
- <name>Repository for JDK 1.4 builds</name>
- <url>http://www.myhost.com/maven/jdk14</url>
- <layout>default</layout>
- <snapshotPolicy>always</snapshotPolicy>
- </repository>
- </repositories>
- t;/profile>
- </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。
- <activeProfiles>
- <activeProfile>alwaysActiveProfile</activeProfile>
- <activeProfile>anotherAlwaysActiveProfile</activeProfile>
- </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的内容:
- <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/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1.0</version>
- <packaging>jar</packaging>
- <name>my-app</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </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,其代码内容如下:
- package com.mycompany.app;
- /**
- * Hello world!
- */
- public class App
- {
- public static void main( String[] args )
- {
- System.out.println( "Hello World!" );
- }
- }
关于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代码中:
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </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,代码如下:
- package com.mycompany.app;
- import junit.framework.Test;
- import junit.framework.TestCase;
- import junit.framework.TestSuite;
- /**
- * Unit test for simple App.
- */
- public class AppTest
- extends TestCase
- {
- /**
- * Create the test case
- *
- * @param testName name of the test case
- */
- public AppTest( String testName )
- {
- super( testName );
- }
- /**
- * @return the suite of tests being tested
- */
- public static Test suite()
- {
- return new TestSuite( AppTest.class );
- }
- /**
- Rigourous Test :-)
- */
- public void testApp()
- {
- assertTrue( true );
- }
- }
调用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
Maven 环境搭建及使用(win10)的更多相关文章
- maven 环境搭建
1.maven环境搭建 1)下载maven,http://maven.apache.org/download.cgi,到本地解压,然后配置环境变量 MAVEN_HOME:D:\software\apa ...
- (一)Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10)
(一)Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10) 系统要求 64位 Windows 10 除了家庭版的 都支持 ~ 64位CPU CPU至少是四核心以上~ 至少 ...
- Maven基础:Maven环境搭建及基本使用(1)
1. Maven环境搭建 1.1 Maven简介 1.2 Maven下载及环境设置 Maven下载地址:http://maven.apache.org/download.cgi 当前下载版本:apac ...
- SpringMVC+Hibernate 项目开发之一(Maven环境搭建)
Maven环境搭建网上一大堆文章,直接引用leiOOlei同学的了:http://www.cnblogs.com/leiOOlei/p/3359561.html Maven版本:apache-mave ...
- SUSE Storage6 环境搭建详细步骤 - Win10 + VMware WorkStation
学习 SUSE Storage 系列文章 (1)SUSE Storage6 实验环境搭建详细步骤 - Win10 + VMware WorkStation (2)SUSE Linux Enterpri ...
- Spring MVC Maven 环境搭建与部署
本文简单演示了本地开发环境的搭建.项目出包.部署运行.HelloWorld,以及部分注意事项. 起初的玩法:先安装Eclipse,然后分别下载并安装Maven.spring的插件,再进行工程模式转换, ...
- [原]项目进阶 之 持续构建环境搭建(三)Maven环境搭建
上次的博文项目进阶 之 持续构建环境搭建(二)Nexus私服器中,我们搭建了一个Nexus的maven私服,这次我们来重点讲解一下Maven的安装和配置.这里说明一下这次的环境搭建,比较基础,但却非常 ...
- maven 环境搭建 Myeclipse配置
一:Maven的下载安装 准备工作: 1)安装环境 Windows xp 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.e ...
- maven环境搭建Myeclipse配置
一.Maven的下载安装 准备工作: 1.安装环境:windows 2.需安装JDK,并配置环境变量(略) 3.Maven版本3.0.5 4.下载地址:链接:https://pan.baidu.com ...
随机推荐
- xtrabackup备份mysql-2 增量备份
---恢复内容开始--- 增量备份 ---恢复内容结束---] 增量备份恢复 1,重演日志 2,恢复数据
- 关于hermes与solr,es的定位与区别
Hermes与开源的Solr.ElasticSearch的不同 谈到Hermes的索引技术,相信很多同学都会想到Solr.ElasticSearch.Solr.ElasticSearch在真可谓是大名 ...
- 【LeetCode】21.合并两个有序链表
题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-> ...
- Linux学习笔记之十一————Linux常用服务器构建之ssh和scp
一.ssh 1.ssh介绍 SSH为Secure Shell的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议. ...
- Linux学习笔记之三————Linux命令概述
一.引言 很多人可能在电视或电影中看到过类似的场景,黑客面对一个黑色的屏幕,上面飘着密密麻麻的字符,梆梆一顿敲,就完成了窃取资料的任务. Linux 刚出世时没有什么图形界面,所有的操作全靠命令完成, ...
- yarn依赖管理工具,和fis3构建工具 gulp详细用法
看视频所了解到的,正在进行摸索. 参考:https://www.cnblogs.com/2050/p/4198792.html这篇介绍gulp的文章非常棒,唯一有一点,页面随时刷新的目前还没实现,不知 ...
- swaggerui集成oauth implicit
swaggerui集成oauth implicit 添加引用 Swashbuckle.AspNetCore IdentityServer4.AccessTokenValidation 预先准备好Ide ...
- 高德地图添加marker及反地理编码获取POI
项目中集成百度.高德.腾讯地图已是司空见惯的事情,今天我总结了一下项目中用到的高德地图常用的功能: 1.展示高德地图并定位显示定位图标: 2.添加实时大头针: 3.反地理编码获取周围兴趣点 效果如下: ...
- 堆排序——HeapSort
基本思想: 图示: (88,85,83,73,72,60,57,48,42,6) 平均时间复杂度: O(NlogN)由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作 ...
- JAVA基础 <一>
java基础的学习要领,多写多写. 学习方法很简单,了解 到 理解 到 熟悉 到 精通 先讲变量吧: public static void main(String[] args) { int ...