maven 教程
打个广告,帮朋友卖点东西,东西超便宜的哟【衣服鞋子等】,厂家直接出货,绝对低于市场价!!! 一般都比市场价便宜3—7折【都是牌子货】,如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!!
一、相关介绍
1、项目的构建方式
1.Eclipse
手工操作较多,项目的构建过程都是独立的,很难一步完成。比如:编译、测试、部署等。开发时每个人的IDE配置都不同,很容易出现本地代码换个地方编译就出错
2.Ant
Ant只是一个项目构建工具,它没有集成依赖管理。Ant在进行项目构建时,它没有对项目目录结构进行约定,需要手动指定源文件、类文件等目录地址。同时它执行task时,需要显示指定依赖的task,这样会造成大量的代码重复。
3.Maven
Maven不仅是一个项目构建工具,更是一个项目管理工具。它在项目构建工程中,比ant更全面,更灵活。Maven在进行项目构建时,它对项目目录结构拥有约定,知道你的源代码在哪里,类文件应该放到哪里去。它拥有生命周期的概念,maven的生命周期是有顺序的,在执行后面的生命周期的任务时,不需要显示的配置前面任务的生命周期。例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程。
附加,构建过程:
2、maven介绍
- Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
- Maven是跨平台的项目管理工具。主要服务于基于java平台的项目构建,依赖管理和项目信息管理。
- Maven主要有两个功能:项目构建,依赖管理。
搜搜:http://mvnrepository.com/
二、maven的安装及配置
1、安装
首先下载maven【官方网站:http://maven.apache.org】,Maven是使用java开发,需要安装jdk1.6以上。下载完成后,如下:
将其解压后(E:\Maven3.0.5),目录如下:
之后进行配置maven的环境变量MAVEN_HOME:
然后在path中添加:
测试maven是否安装成功,在系统命令行中执行命令:mvn –v,如果出现如下信息,成功:
2、配置
1.全局配置
在maven安装目录的conf里面有一个settings.xml文件,这个文件就是maven的全局配置文件。该文件中配置来maven本地仓库的地址,打开该文件在49~54行有:
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ~/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
表示仓库默认在当前系统的用户目录下的m2/repository中,该目录是本地仓库的目录。默认是注释掉的。打开系统目录,看到:
2.用户配置
用户配置文件的地址:~/.m2/settings.xml,该文件默认是没有,需要将全局配置文件拷贝一份到该目录下。之后便可以重新指定本地仓库地址,如果不指定,则默认是~/.m2/repository目录,如果用户配置文件不存在,则使用全局配置文件的配置。
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ~/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\repository\maven\repo</localRepository><!--添加-->
即完成。
三、创建maven工程
1、Maven工程结构
Project |--src(源码包) |--main(正常的源码包) |--java(.java文件的目录) |--test(测试的源码包) |--java |--resources |--target(class文件、报告等信息存储的地方) |--pom.xml(maven工程的描述文件) |
2、创建hellomaven工程
- 第一步:按照maven的工程结构创建hellomaven工程(F:\临时存储\hellomaven)
hellomaven
|--src |--main |--java |--com |--shen |--maven |--HelloMaven.java |--resources |--test |--java |--com |--shen |--maven |--TestHelloMaven.java |--resources |--pom.xml |
- 第二步:创建HelloMaven.java
public class HelloMaven{
public String sayHello(String name){
return name+" Hello";
}
}
- 第三步:创建TestHelloMaven.java
public class TestHelloMaven{
@Test
public void testsayHello(){
HelloMaven helloMaven=new HelloMaven();
String re=helloMaven.sayHello("shen");
assertequals("shen Hello",re);
}
}
- 第四步:编辑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/xsd/maven-4.0.0.xsd">
<!-- 版本:4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织名称:暂时使用 组织名称+项目名称 作为组织名称 -->
<!-- 组织名称:实际名称 按照访问路径规范设置,通常以功能作为名称:eg: junit Spring -->
<groupId>com.itheima.maven</groupId>
<!-- 项目名称 -->
<artifactId>HelloMaven</artifactId>
<!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 -->
<!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号 -->
<version>0.0.1</version>
<!-- 名称:可省略 -->
<name>Hello</name>
<!-- 依赖关系 -->
<dependencies>
<!-- 依赖设置 -->
<dependency>
<!-- 依赖组织名称 -->
<groupId>junit</groupId>
<!-- 依赖项目名称 -->
<artifactId>junit</artifactId>
<!-- 依赖版本名称 -->
<version>4.9</version>
<!-- 依赖范围:test包下依赖该设置 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
3、Maven命令的使用
Maven的命令要在pom.xml所在目录中去执行,即将cmd调到【F:\临时存储\hellomaven】中。
1.单个命令
- Mvn compile:编译命令,该命令会将main目录中的源码进行编译,执行后在hellomaven下多一个target文件夹,仓库中也多了相关jar包等资源。
- Mvn clean:清除命令,清除已经编译好的class文件,具体说清除的是target目录中的文件,包括target。仓库不清空
- Mvn test:测试命令,该命令会将test和main目录中的源码进行编译,也会生成target等。并且会在【target\surefire-reports】中生成.txt文件报告执行情况(错误)。
- Mvn package:打包命令,即将该程序打包为jar。在target目录下。
- Mvn install:安装命令,会将打好的包,安装到本地仓库。生成的版本号等信息就是pom.xml文件配置的(引用):
2.组合命令
- Mvn clean compile:先清空再编译
- mvn clean test:先清空再测试
- mvn clean package:先执行clean,再执行package,将项目打包,通常应用于发布前
- mvn clean install:先执行clean,再执行install,将项目打包,通常应用于发布前
注意:maven项目在打成jar包时,默认不会把第三方jar打包,如果想同时打包第三方jar文件,需要添加如下:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!--这部分可有可无,加上的话则直接生成可运行jar包-->
<!--<archive>-->
<!--<manifest>-->
<!--<mainClass>${exec.mainClass}</mainClass>-->
<!--</manifest>-->
<!--</archive>-->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
四、集成开发环境
1、安装M2Eclipse(Eclipse)
第一步:将以下目录中的文件拷贝
第二步:拷贝到eclipse中的dropins目录
第三步:查看eclipse中是否安装成功
第四步:设置maven的安装路径
第五步:设置maven的用户配置
2、配置Maven4MyEclipse(Eclipse)
首先添加自己安装的maven:
然后添加用户的仓库地址:
五、在MyEclipse中创建Maven工程
1、通过骨架方式创建(联网)
首先选择创建Maven工程:
之后有如下:
注意:这些东西在联网时才会出现。
然后:
创建完成。之后即可编写,其中:
2、通过非骨架方式创建
要在这里选择:
然后有:
说明,jar表示创建java项目,war表示创建web项目。在新建的web项目中需要手动的添加(在webAPP下面)WEB-INF及web.xml
六、Maven的核心概念
1、坐标
在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器。Maven坐标主要组成:
- groupId:定义当前Maven组织名称
- artifactId:定义实际项目名称
- version:定义当前项目的当前版本
2、依赖管理
1.依赖范围
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
- compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效(默认)
- test:测试依赖范围。只对于测试classpath有效
- provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包时不能添加,因为Tomcat中已经有了,会冲突
- runtime:运行时提供。例如:jdbc驱动,只有在运行时才需要
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>compile</scope>
</dependency>
2.依赖传递
假如现在有三个工程A、B、C,B工程依赖A工程,C工程依赖B工程,那么B工程是C工程的直接依赖,A工程是C工程的间接依赖,并且C与B表示第一直接依赖范围,B与A表示第二直接依赖范围。那么(如A依赖于Junit):
- 当第二依赖(B)的范围是compile的时候,传递性依赖(A)的范围与第一直接依赖(B)的范围一致。
- 当第二直接依赖(B)的范围是test的时候,依赖不会得以传递(C不会依赖A)。
- 当第二依赖(B)的范围是provided的时候,只传递第一直接依赖(B)范围也为provided的依赖,且传递性依赖(C)的范围同样为 provided;
- 当第二直接依赖(B)的范围是runtime的时候,传递性依赖(C)的范围与第一直接依赖(A)的范围一致,但compile例外,此时传递的依赖范围为runtime;
3.依赖冲突
在maven中存在两种冲突方式:一种是跨pom文件的冲突,一种是同一个pom文件中的冲突。
- 跨pom文件的冲突:A的pom文件中依赖来junit的4.9版本,那么B和C中都是使用了4.9版本。如果B中重新依赖junit的4.8版本,那么B和C中都是使用了4.8本,这体现来依赖的就近使用原则。
- 同一个pom文件的冲突:B的pom文件中先指定了依赖来junit的4.9版本,又指定了依赖来junit的4.8版本,谁在下面就是谁。
4.可选依赖
optional标签标示该依赖是否可选,默认是false。可以理解为,如果为true,则表示该依赖不会传递下去,如果为false,则会传递下去。
5.排除依赖
Exclusions标签可以排除依赖:
<dependency>
<groupId>com.itheima.maven</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.itheima.maven</groupId>
<artifactId>A</artifactId>
</exclusion>
</exclusions>
</dependency>
表示C虽然依赖于B,但是不依赖于A(B依赖于A)。
3、生命周期
Maven有三个生命周期:clean生命周期、default生命周期、site生命周期。生命周期可以理解为项目构建的步骤集合。生命周期是由多个阶段(Phase)组成。每个阶段都是一个完整的功能,比如mvn clean中的clean就是一个阶段。
1.Clean生命周期
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些需要在clean之后立刻完成的工作
说明:mvn clean命令,等同于 mvn pre-clean clean。只要执行后面的命令,那么前面的命令都会执行,不需要再重新去输入命令。Clean生命周期,和在生命周期中的clean阶段不同。
2.Default生命周期
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码。
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR 。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
说明:在maven中,只要在同一个生命周期,你执行后面的阶段,那么前面的阶段也会被执行,而且不需要额外去输入前面的阶段,这样大大减轻了程序员的工作。(这也是为什么前面执行test命令时,为什么main中的java文件也被编译)
3.Site生命周期
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
4、插件
插件(plugin),每个插件都能实现一个阶段的功能。Maven的核心是生命周期,但是生命周期相当于主要指定了maven命令执行的流程顺序,而没有真正实现流程的功能,功能是有插件来实现的。比如,compile就是一个插件实现的功能。
1.编译插件
即JDK:可以指定JDK的版本号
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
表示使用jdk_1.7。【修改后更新项目】
2.tomcat插件
1.基本应用
默认输入tomcat:run命令去使用tomcat插件来启动web工程,但是默认的tomcat插件使用的tomcat版本是tomcat6。如果想更改,需要手动配置tomcat插件:
<plugin>
<!-- 配置插件 -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
使用tomcat7来运行web工程,它的命令是:tomcat7:run(不是tomcat:run,否则path无效)
注意:path中的/表示当前web项目,故在访问的时候不需要输入项目名称(也就是该插件只能同时运行一个web项目),如当前web项目为maven,那么在访问webapp下面的index.jsp时只需要http://localhost:8080/index.jsp
附加,常见命令:
命令 | 描述 |
tomcat:deploy | 部署一个web项目 |
tomcat:reload | 重新加载web项目 |
tomcat:start | 启动Tomcat服务器 |
tomcat:stop | 关闭Tomcat服务器 |
tomcat:undeploy | 停止项目 |
tomcat:run | 启动嵌入式Tomcat |
2.发布到远程tomcat
使用 tomcat内部manager 程序,进行项目热部署 (需要远程tomcat 必须开启的 ),首先在 tomcat/conf/tomcat-user.xml 建立账号:
<!--图形化界面访问用户-->
<user username="shen" password="123456" roles="admin-gui,manager-gui" />
<!--远程服务器访问-->
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>
tomcat6如下:
<role rolename="manager"/>
<user username="tomcat" password="123456" roles="manager"/>
tomcat7如下:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>
然后配置pom.xml 允许远程发布:
<!-- 使用 plugin 配置tomcat-maven-plugin -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<!-- 对插件进行配置 -->
<configuration>
<!-- 内嵌插件 端口 -->
<port>80</port>
<!-- 远程发布 -->
<url>http://localhost:8080/manager/text</url>
<server>myserver</server>
</configuration>
</plugin>
tomcat6如下:
<url>http://localhost:8080/manager</url>
tomcat7如下:
<url>http://localhost:8080/manager/text</url>
<server>myserver</server>
然后配置 setting.xml 服务器myserver 连接属性如下:
<server>
<id>myserver</id>
<username>tomcat</username>
<password>123456</password>
</server>
保证外部tomcat 正确运行后,执行 tomcat:deploy【打开】 / tomcat:redeploy 【关闭】,将会把当前项目发布到该远程tomcat服务器上。
5、继承
1.基本构建
在maven中的继承,指的是pom文件的继承。首先创建父工程(Mavenparent):
注意,打包方式为pom。创建之后工程目录如下:
之后便可以创建子工程,子工程(MavenSub)如下:
要指定父工程的GAV。打开子工程的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>
<parent>
<groupId>com.shen.maven</groupId>
<artifactId>MavenParent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.shen.maven</groupId>
<artifactId>MavenSub</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build/>
</project>
其实也可以修改现有工程成为子工程,就是在pom文件中添加如上。在父工程中对jar包进行依赖,在子工程中都会继承此依赖。
2.父工程统一管理版本号
父工程可以使用dependencyManagement标签管理依赖,其实没有真正依赖(即父工程中实际没有引用该项目),它只是管理依赖的版本。如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
</dependencyManagement>
那么子工程中如果需要junit:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
不在指定版本号。实际上父工程还可以集中管理版本号,更改如下:
<properties>
<junit.version>4.9</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
注意:<junit.version>这个标签是自己任意写到,通过如上来吧版本集中起来。
6、聚合工程
在真实项目中,一个项目有表现层、业务层、持久层,对于业务层和持久层,它们可以在多个工程中被使用,所以一般会将业务层和持久单独创建为java工程,为其他工程依赖。首先创建一个聚合工程【在打包方式时选择pom】,然后再创建聚合工程的子工程,选中聚合工程-》右键-》新建Maven Module即可。在创建web工程时,tomcat插件应该配置在聚合工程的pom文件中。
七、Maven仓库管理
Maven仓库就是用来统一存储所有Maven共享构建的位置就是仓库。根据Maven坐标定义每个构建在仓库中唯一存储路径大致为:groupId/artifactId/version/artifactId-version.packaging,仓库可以分为本地仓库和远程仓库,远程仓库又可以分为中央仓库(不包含有版本的jar包,网站:http://repo1.maven.org/maven2 )和私服(为所有来自中央仓库的构建安装提供本地缓存)。Maven的私服可以通过安装nexus来创建(下载网站:http://nexus.sonatype.org/ )。首先要有tomcat,然后将nexus的war包拷贝到tomcat的webapps下:
之后启动tomcat,访问 http://localhost:8080/nexus-2.7.0-06/ (这里是2.7.0-06版本)即可进入管理页面。其中第一次启动时将会创建nexus的本地目录(默认在用户下面的sonatype-work文件)。打开其文件夹,如下:
在访问页面时需要账号,默认账号为:用户名【admin】;密码【 admin123】。然后Nexus的仓库和仓库组管理页面如下:
说明:
仓库有4种类型 :
- group(仓库组):一组仓库的集合
- hosted(宿主):配置第三方仓库 (包括公司内部私服 )
- proxy(代理):私服会对中央仓库进行代理,用户连接私服,私服自动去中央仓库下载jar包或者插件
- virtual(虚拟):兼容Maven1 版本的jar或者插件
Nexus的仓库和仓库组介绍:
3rd party: 一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构建
Apache Snapshots: 一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构建
Central: 代理Maven中央仓库
Central M1 shadow: 代理Maven1 版本 中央仓库
Codehaus Snapshots: 一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件
Releases: 一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件
Snapshots: 一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件
Public Repositories:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务
注意:如果想在私服没有的情况下在中央仓库自动下载到私服需要进行如下设置:
之后可以配置所有构建均从私服下载,在本地仓库的setting.xml中配置如下:
<mirrors>
<mirror>
<!--此处配置所有的构建均从私有仓库中下载 *代表所有,也可以写central -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8080/nexus-2.7.0-06/content/groups/public/</url>
</mirror>
</mirrors>
如果想将自己的项目部署构建到Nexus,首先要有Nexus的访问权限控制,在本地仓库的setting.xml中配置如下:
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
之后配置pom文件
<distributionManagement>
<repository>
<id>releases</id>
<name>Internal Releases</name>
<url>http://localhost:8080/nexus-2.7.0-06/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Internal Snapshots</name>
<url>http://localhost:8080/nexus-2.7.0-06/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
然后执行maven的deploy命令即可完成。
相关阅读
在Intellij idea里使用Maven构建一个webapp骨架项目解
maven 骨架下载很慢,但没有卡死。慢是两个原因产生的:maven每次进行创建的时候回去网上下载artheType-catalog.xmlmaven自带的仓库
一.Maven的setting配置文件 和 在Eclipse中对Maven的正确配置。 1.Maven的配置文件(Maven的安装目录/conf/settings.xml ) 和 Maven
Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包。接下来小宝鸽,将从下面几个方向介绍maven:(1)Ma
Maven系列学习(1)——安装以及本地仓库和仓库镜像的配置
最近因为一些工程的需要,也是老师的建议,开始对maven进行学习,以前没接触maven之前就经常为java包的使用中出现的一些问题感到困惑:
Maven中< resources>标签详解 clean install -DskipTests -P test 传入test参数 DskipTests,不执行测试用例 -P test 会