笔记。
安装
官网下载安装包,解压。
bin目录包含mvn的运行脚本
boot目录包含一个类加载器的框架
conf是配置文件目录
配置环境变量M2_HOME
变量值:E:\maven\apache-maven-3.6.1
Path中添加%M2_HOME%\bin
cmd输入mvn -v
输出1
2
3
4Maven home: E:\maven\apache-maven-3.6.1\bin\..
Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: E:\JDK\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
即安装成功。
结构
1 | src |
新建结构E:\maven\code\maven01\src\main\java\com\jinger\maven01\model
在这里新建HelloWorld.java1
2
3
4
5
6
7package com.jinger.maven01.model;
public class HelloWorld{
public String sayHello(){
return "Hello World!";
}
}
新建结构E:\maven\code\maven01\src\test\java\com\jinger\maven01\model
在这里新建HelloWorldTest.java1
2
3
4
5
6
7
8
9
10
11package com.jinger.maven01.model;
import org.junit.*;
import org.junit.Assert.*;
public class HelloWorldTest{
public void testHello(){
Assert.assertEquals("Hello World!",new HelloWorld().sayHello());
}
}
在E:\maven\code\maven01新建pom.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jinger.maven01</groupId>
<artifactId>maven01-model</artifactId>
<version>0.0.1SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
groupId的值是项目包名
artifactId的值是模块名
cmd里mvn compile
编译,第一次安装会自动下载相关依赖。
mvn test
测试,显示1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.jinger.maven01.model.HelloWorldTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.068 s
[INFO] Finished at: 2019-07-28T17:26:39+08:00
[INFO] ------------------------------------------------------------------------
跟目录下生成了target文件夹
mvn package
打包
1 | [INFO] Building jar: E:\maven\code\maven01\target\maven01-model-0.0.1SNAPSHOT.jar |
生成了jar包。
基础
mvn -v 查看maven版本
compile 编译
test 测试
package 打包
clean 删除target
install 安装jar包到本地仓库中
新建结构E:\maven\code\maven02\src\main\java\com\jinger\maven02\util
在这里新建Speak.java1
2
3
4
5
6
7
8
9package com.jinger.maven02.util;
import com.jinger.maven01.model.HelloWorld;
public class Speak{
public String sayHi(){
return new HelloWorld().sayHello();
}
}
新建结构E:\maven\code\maven02\src\test\java\com\jinger\maven02\util
在这里新建SpeakTest.java1
2
3
4
5
6
7
8
9
10
11package com.jinger.maven02.util;
import org.junit.*;
import org.junit.Assert.*;
public class SpeakTest{
public void testHello(){
Assert.assertEquals("Hello World!",new Speak().sayHi());
}
}mvn compile
编译
1 | 错误:[ERROR] /E:/maven/code/maven02/src/main/java/com/jinger/maven02/util/Speak.java:[3,32] 程序包com.jinger.maven01.model不存在 |
进入maven01文件夹执行mvn install
发送到本地仓库中
在pow.xml加入依赖项1
2
3
4
5<dependency>
<groupId>com.jinger.maven01</groupId>
<artifactId>maven01-model</artifactId>
<version>0.0.1SNAPSHOT</version>
</dependency>
完整pom.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jinger.maven02</groupId>
<artifactId>maven02-model02</artifactId>
<version>0.0.1SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>com.jinger.maven01</groupId>
<artifactId>maven01-model</artifactId>
<version>0.0.1SNAPSHOT</version>
</dependency>
</dependencies>
</project>
自动创建目录骨架
archetype插件
创建目录的两种方式:
mvn archetype:generate
选1389 Choose org.apache.maven.archetypes:maven-archetype-quickstart version 再选最新版
Confirm properties configuration:
groupId: com.jinger.maven03
artifactId: maven03-service
version: 1.0.0SNAPSHOT
package: com.jinger.maven03.service
1
2
3
4mvn archetype:generate -DgroupId=组织名, 公司网址的反写+项目名
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage=代码所存在的包名
坐标和仓库
构件通过坐标作为其唯一标识
修改镜像仓库位置:
E:\maven\apache-maven-3.6.1\conf
打开settings.xml
146行增加1
2
3
4
5
6<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>
<name>central mirror in China</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
这个源好像不太行,换成阿里云的可以1
2
3
4
5
6<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf> *
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
修改默认本地仓库位置
49行增加1
<localRepository>E:/maven/repo</localRepository>
将该settings.xml复制到repo文件夹下。
在Eclipse中的使用
新版Eclipse自带Maven插件。
新建New-Other-Maven Project,选择quickstart模板。
Group Id:com.jinger.hi
Artifact Id:hi
建成后,对pom.xml右键,Run As-2 Maven build …
在Goals中填入compile
再在Goals中填入package
jar包构建成功
Maven生命周期和插件
完整的项目构建过程包括:
清理、编译、测试、打包、集成测试、验证、部署
maven生命周期:
clean 清理项目
default 构建项目
site 生成项目站点
clean清理项目
pre-clean 执行清理前的工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件
default 构建项目(最核心)
compile test package install
site 生成项目站点
pre-site 在生成项目站点前要完成的工作
site 生成项目的站点文档
post-site 在生成项目站点后要完成的工作
site-deploy 发布生成的站点到服务器上
举例
在pom.xml新增1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
run as - maven build …clean package
pom.xml常用元素
1 | pom.xml:maven项目的核心管理文件,用于项目描述、组织管理、依赖管理、构建信息的管理,Pom中包含了许多的标签。 |
scope
三种classpath:
- 编译
- 测试
- 运行
compile:默认的范围,编译测试运行都有效
provided:在编译和测试时有效
runtime:在测试和运行时有效
test:只在测试时有效
system:与本机系统相关联,可移植性差
import:导入的范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置
依赖
依赖的传递:
多个项目依次依赖,A<-B<-C,后面的引入前面的项目坐标
要把前面的项目编译、打包、安装后,后面的项目才能运行build
短路冲突:
1、短路优先
A->B->C->X(jar)
A->D->X(jar)
先解析下面的
2、先声明优先
如果路径长度相同,则谁先声明,先解析谁
聚合和继承
项目的继承
在父类项目中使用dependencyManagement对依赖进行管理,但是并不会使用依赖,子类需要使用parent标签,来引用父类中的依赖,一般可以将版本号在父类中进行声明,子类无需声明版本号,这样可以保证子类和父类版本号一致。项目的聚合
将packaging打包方式改为pom,使用modules标签,引入其他项目1
2
3
4
5<modules>
<module>../A</module>
<module>../B</module>
<module>../C</module>
</modules>
构建web项目
新建项目,模板选择webapp。
GroupId: com.jinger.webdemo
Artifact Id:webdemo
建成后,在Navigator中新建src/main/java
和src/test/java`
src/test/resources`文件夹
在Project Explorer中对项目右键Build Path
-Configure Build Path
-Source
,确保Output folder是webdemo/target/classes
项目属性-Project Facets
(没有这一项请下载输入http://download.eclipse.org/releases/oxygen ,选择Web, XML, Java EE and OSGi Enterprise Development 安装即可。)
勾选Dynamic Web Module
最终发布产品时不需要测试代码,项目属性-Deployment Assemnly,remove相关测试文件。
在pom.xml的1
2
3
4
5
6
7<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
</plugin>
</plugins>
run as build jetty:run
浏览器输入http://localhost:8080/
显示Hello World!
在打包成功后使用jetty:run来运行jetty服务
1
2
3
4
5
6
7
8<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
run as build clean package
浏览器输入http://localhost:8080/
显示Hello World!
使用tomcat同理。