maven基本使用-个人手稿版
一.项目会遇到什么事情?
1,构建:编译代码,运行测试,打包,部署应用,运行服务器等;
2,依赖:项目依赖大量的第三方包,第三方包又依赖另外的包;对依赖包的管理非常麻烦;
Maven能做什么事情?
1,Maven翻译为“知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具;
2,Maven主要用作基于Java平台的项目(Maven本身也是Java编写的)的构建、依赖包管理和项目信息管理;
3,Maven能提供一种项目的配置,配置好的项目,只需要运行一条简单的命令,就能完成重复的,繁琐的构建动作;
4,Maven能提供一种项目的依赖配置,配置好的项目,Maven能自动的从Maven的中央仓库中帮我们下载并管理项目依赖的jar包,并且还能自动的管理这些jar包依赖的其他jar包;
5,Maven提供了一种标准的项目目录结构,测试命名规则等项目的最佳实践方案,统一了不同项目的学习成本(约定大于配置);
二.为什么用Maven?
IDE/Eclipse:
1,手工操作较多,编译、测试、部署等工作都是独立的,很难一步完成
2,每个人的IDE配置都不同,很容易出现本地代码换个地方编译就出错
3,每个项目的依赖包必须自己维护了管理
Ant:
1,没有一个约定的目录结构
2,必须明确让ant做什么,什么时候做,然后编译,打包
3,没有生命周期,必须定义目标及其实现的任务序列
4,没有集成依赖管理
- Maven的安装
1.检查JDK安装的情况(需要1.6以上的版本):
添加JAVA_HOME,需要指向JDK安装目录;
配置CLASSPATH的:变量名:CLASSPATH。变量值:设置为.;%JAVA_HOME%/lib
添加PATH,添加%JAVA_HOME%\BIN;
2.安装maven
设置系统环境变量,MAVEN_HOME,指向maven的根目录
设置环境变量Path,将%MAVEN_HOME%\bin加入Path中
注意:所有标点均为英文下标点
配置成功后,在cmd中输入mvn -v 就出现如下信息,表示配置成功
C:\Users\Administrator\Desktop>mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1;
2014-12-15T01:29:23+08:00)
Maven home: E:\javaStudy\software\maven\apache-maven-3.2.5\bin\..
Java version: 1.8.0_31, vendor: Oracle Corporation
Java home: E:\javaStudy\software\JDK
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"
- maven的文件结构
bin:包含了Maven的运行脚本文件;
boot:Maven的依赖的类加载器;
conf:非常重要,Maven的全局配置文件(settings.xml),定制Maven的运行行为
lib:Maven依赖的jar包(里面的maven-model-builder-3.2.5.jar重要,后面再介绍)
.m2文件夹
运行一个maven命令:mvn help:system,观察maven的执行动作;
在用户的个人文件夹下,生成一个.m2文件夹,文件夹里面有一个repository文件夹,里面是刚下载的jar文件;
最佳实践:将仓库地址重新定位
1,将maven的conf/settings.xml拷贝到.m2中;作为个人MAVEN配置文件;
2,重新定位repository目录地址:<localRepository>配置;
- Maven的简单使用
1.hello maven项目
1)Maven规定了一套默认的项目格式:
src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring、struts2配置文件,db.properties
src/main/webapp —— 存放jsp,css,image等文件
src/test/java —— 存放所有测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
pom.xml——主要要写的maven配置文件
target —— 项目由maven自动输出位置
2)按照下面的目录结构创建一个目录结构:
--src
-----main
----------java
-----test
----------java
--pom.xml
3)编写下面的Java类:
(1)在src/main/java下添加类:
package cn.xmg.maven;
public class Hello {
public String sayHello(String name){
return "Hello Maven World!";
}
}
(2)在src/test/java下添加类:
package cn.xmg.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("World");
assertEquals("Hello World!",results);
}
}
4)编辑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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.xmg.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
5)切换到项目根目录下,用cmd分别执行下列命令并观察:
(1)执行 mvn compile命令
编译项目
- 执行mvn clean命令
清空编译好的东西
- 执行mvn clean compile命令
先清空后编译
(4)执行mvn clean test命令
进行测试
(5)执行mvn clean package命令
将项目打包
(6)执行mvn clean site命令
生成文档
- 执行mvn install命令
将自己的项目打包jar包并上传到本地仓库,上传地址和pom.xml配置文件中相同,如下:
<modelVersion>4.0.0</modelVersion>
<groupId>cn.xmg.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
Maven帮我们下载的jar包的目录和pom.xml配置文件相对应
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
也就是说,可以在pom.xml中配置的jar包目录,使用自己上传的jar包,按照这样的格式去配置pom.xml文件。
在pom.xml配置文件中追加配置,将自己上传的项目jar包作为jar包被引用。然后删除cn\xmg\maven目录下的Hello.java文件,然后重新进行测试。
能够测试成功说明该测试已经将自己项目打包生成的jar包引用了。
使用maven很重的一点就是使用这样的一种项目与项目间的依赖关系。
附录:
可以通过MAVEN的命令来生成Maven项目骨架:
执行命令mvn archetype:generate
可以看到有很多的archetype,每个前面有一个序号,输入序号(或者直接回车,选的就是quick-start):
一次输入需要的内容,
项目创建成功
2,一次性生成
mvn archetype:create -DgroupId=[your group id] -DartifactId=[your archetype id] -DarchetypeArtifactId=maven-archetype-webapp
3,如果mvn archetype:generate列出内容过多,或者下载过慢,运行:
mvn archetype:generate -DarchetypeCatalog=internal
只列出系统内部有的archetype;
四.eclipse/myeclipse + maven
1.在myeclipse中安装maven插件
将这三个插件文件复制到myeclipse/eclipse安装目录下的dropins目录,重启myeclipse/eclipse即可;
- Maven插件基本配置
- 使用
- 导入已经存在的maven项目
- 新建maven项目
在工作空间: new--》others--》
- Maven中一些重要概念
1.坐标:
Maven中坐标就是用来规范maven唯一标示一个构建的方法;
Maven坐标构成:
1)groupId:项目名称
2)artifactId:项目中Maven项目/模块名称
3)version:项目版本
4)packing:打包的方式,比如jar、war、pom等;
5)classifier:附属构件,比如source,javadoc等,但是注意,一般不会直接定义classifier,附加构件不是直接定义的,是插件帮助构件的;
生成的文件名是根据坐标生成的,规则:artifactId-version[-classifier].packing
在仓库中的位置也是根据坐标生成的,后面再介绍;
2.配置依赖:
1)一个较完整的依赖配置包括
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<type></type>
<scope>test</scope>
<optional></optional>
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
groupId:该依赖项目的groupId;
artifactId:该依赖项目的artifactId;
version:该依赖项目的版本;(也是通过这三个坐标找到jar包位置)
type:依赖项目的类型,对应坐标中的packing,即文件类型,一般不填,默认为jar;
scope:该依赖项目的依赖范围;
optional:标记依赖是否可选;
exclusion:设置排除依赖传递性;
(1)scope
--》Maven在编译,测试,运行的时候,各需要一套classpath;(比如编译的时候会有编译的classpath;测试的时候会有测试的classpath;)scope表明该依赖的项目和三个classpath的关系
--》scope的可选值:
1)compile:默认,绑定编译classpath;注意,编译classpath在编译,测试,运行时都有效;
2)test:绑定测试classpath;
3)provided:运行时已提供;绑定编译和测试的classpath;运行时无效;典型的如servlet-api.jar
4)runtime:测试,运行时有效;典型的如jdbc具体驱动实现;
5)import:(maven继承中使用,不讲)
--》依赖的传递性:
1)测试junit4.8和junit4.9的区别;并查看Junit4.9依赖项目中的pom.xml文件;
2)依赖的分类;A->B(第一直接依赖);B->C(第二直接依赖);A->C(传递依赖)
3)依赖的传递:
(第二依赖) compile test provided runtime
(第一依赖)
compile compile N compile
test test N test
provided provided N provided provided
runtime runtime N runtime
- Optional
依赖的可选:可选项目不会被传递;
如果A项目依赖B项目;B项目依赖C或者D(比如一个基础项目,兼容了MYSQL或者ORACLE,那么他可能依赖mysql-connector或者classes12.jar)
但是在A项目运行的时候,只需要C或者D其中一个就可以了。那么对于B项目来说,C和D项目就可以设置optional为true;在A项目中单独设置C或者D的依赖;
- Exclusion
exclusions:排除一个或多个传递性依赖;
传递性依赖可能带来的问题:
A->B1;C->B2;那么项目中会有两个B项目;如果包不存在冲突,那么就可以保留一个高版本的B版本即可;在A项目中:
<dependency>
<groupId>org.xxx</groupId>
<artifactId>A</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>org.xxx</groupId>
<artifactId>B</artifactId>
</exclusion>
</exclusions>
</dependency>
2)最佳实践
(1)使用properties归类版本:
<properties>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
(2)依赖的分析:
mvn dependency:analyze
mvn dependency:tree
- 仓库
仓库用于统一管理和存放依赖包的地方;
仓库中依赖包存放的方式和坐标的对应关系:groupId/artifactId/version/artifactId-version.packing
仓库的分类:本地仓库和远程仓库;组件仓库和插件仓库;
maven仓库 —— 本地仓库
|—— 远程仓库 —— 中央仓库
|—— 私服
|—— 其他公共库
超级POM中:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
id:仓库的id,只有中央仓库id为central,仓库的id必须唯一,如果其他仓库id覆盖central,则相当于覆盖了中央仓库;
url:仓库的URL地址;
layout:仓库的布局,MAVEN2以上都用default;
snapshots:代表不从中央仓库中下载快照版本;
可以在POM中配置其他的公共仓库;
仓库的镜像:如果一个仓库完全和中央仓库同步,我们就可以选择本地的这种仓库作为中央仓库的镜像仓库;
在settings.xml中配置:
<mirror>
<id>maven.cn</id>
<mirrorOf>central</mirrorOf>
<name>cn</name>
<url>http://maven.net.cn/content/groups/public/</url>
</mirror>
<mirrorOf>:
*:匹配所有的仓库(比如配置私服)
external:*:所有远程仓库(localhost,file除外);
rep1,rep2:仓库1和仓库2;
*,!rep1:除了仓库1其他所有的;
仓库的搜索:
http://www.mvnrepository.com/
- 生命周期
Maven的生命周期是抽象的,比如当我们执行mvn clean实际上会执行一系列的动作,这些动作就是生命周期;
Maven的生命周期由多个阶段构成,在Maven中有以下几套生命周期:
1,clean(清理,对应clean):
pre-clean:执行清理前要做的事情
clean:执行清理动作
post-clean:清理后要做的事情
2,default:(构建,对应install)
validate:
initialize:初始化工作
generate-sources:
process-sources: 复制并处理资源文件,至目标目录,准备打包。
compile: 编译项目的源代码。
process-classes:
generate-test-sources:
process-test-sources:复制并处理资源文件,至目标测试目录。
test-compile:编译测试源代码。
process-test-classes:在测试前的工作
test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package:执行打包前的工作
package:接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test:集成测试前工作;
integration-test:执行集成测试;
post-integration-test:集成测试后的工作;
verify:
install:将包安装至本地仓库,以让其它项目依赖。
deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
3,site(站点,对应site)
pre-site:执行一些需要在生成站点文档之前完成的工作
site:生成项目的站点文档
post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy:将生成的站点文档部署到特定的服务器上
命令行和生命周期的对应:
1,注意,命令行不是和生命周期一一对应,可能一个命令行只执行了一个生命周期的部分阶段;
2,mvn clean:对应clean周期的clean之前的东西;
3,mvn test:对应default周期的test之前的阶段;
4,mvn clean install:对应clean+default周期的install之前的;
注意:生命周期中不是每个阶段都有事情做!!!!!
- 插件目标和插件
1,Maven中只定义了生命周期,而生命周期中每个步骤怎么做,是需要插件来完成的;
2,一个插件往往能执行多个功能,插件的每一个功能,就叫做插件的目标;
3,插件绑定:插件的目标需要和生命周期中的某个阶段绑定,才能完成一定的任务,插件绑定分两种:
1)内置绑定:比如,maven-clean-plugin:clean,(比如我们可以直接执行mvn org.apache.maven.plugins:maven-clean-plugin:clean插件)
2)自定义绑定:可以通过<plugin>的<execution>元素把插件目标绑定在生命周期上;
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<executions>
<execution>
<phase>process-test-classes</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
</executions>
</plugin>
4,内置绑定的执行:
1,比如mvn dependency:tree,等价于执行mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree;在这里其实就可以看到groupId,artifactId,version都存在了;
2,怎么定位插件仓库?
1,插件是单独放在插件仓库之中的;
2,默认的插件groupId都是org.apache.maven.plugins;
3,在插件库中找到org\apache\maven\plugins,里面有一个maven-metadata-central.xml;
<plugin>
<name>Apache Maven Clean Plugin</name>
<prefix>clean</prefix>
<artifactId>maven-clean-plugin</artifactId>
</plugin>
<plugin>
<name>Apache Maven Compiler Plugin</name>
<prefix>compiler</prefix>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
在这里就能找到artifactId;
- 私服
掌握nexus私服的搭建和配置;
- 点赞
- 收藏
- 关注作者
评论(0)