安装 java jdk(环境变量) 安装maven (环境变量)
一、安装
官网下载安装包,解压。
- bin目录包含mvn的运行脚本
- boot目录包含一个类加载器的框架
- conf是配置文件目录
- lib目录 类库和第三方依赖
配置环境变量M2_HOME
变量值:E:\maven\apache-maven-3.6.1
Path中添加%M2_HOME%\bin
测试
cmd输入mvn -v
输出
Maven 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"
即安装成功。
二 约定的目录结构
src
-main
-java
-package
-test
-java
-package
resources
新建结构E:\maven\code\maven01\src\main\java\com\oneboi\maven01\model 在这里新建HelloWorld.java
package com.oneboi.maven01.model;
public class HelloWorld{
public String sayHello(){
return "Hello World!";
}
}
新建结构E:\maven\code\maven01\src\test\java\com\oneboi\maven01\model 在这里新建HelloWorldTest.java
package com.oneboi.maven01.model;
import org.junit.*;
import org.junit.Assert.*;
public class HelloWorldTest{
@Test
public void testHello(){
Assert.assertEquals("Hello World!",new HelloWorld().sayHello());
}
}
在E:\maven\code\maven01新建pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.oneboi.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
测试,显示
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.oneboi.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] ------------------------------------------------------------------------
三 、基础 构建命令
- mvn -v 查看maven版本
- compile 编译
- test 测试
- package 打包
- clean 删除target
- install 安装jar包到本地仓库中
新建结构E:\maven\code\maven02\src\main\java\com\oneboi\maven02\util 在这里新建Speak.java
这里引用了HelloWorld类
package com.oneboi.maven02.util;
import com.oneboi.maven01.model.HelloWorld;
public class Speak{
public String sayHi(){
return new HelloWorld().sayHello();
}
}
新建结构E:\maven\code\maven02\src\test\java\com\oneboi\maven02\util 在这里新建SpeakTest.java
package com.oneboi.maven02.util;
import org.junit.*;
import org.junit.Assert.*;
public class SpeakTest{
@Test
public void testHello(){
Assert.assertEquals("Hello World!",new Speak().sayHi());
}
}
mvn compile
编译
错误:[ERROR] /E:/maven/code/maven02/src/main/java/com/oneboi/maven02/util/Speak.java:[3,32] 程序包com.oneboi.maven01.model不存在
进入maven01文件夹执行mvn install
发送到本地仓库中
在pow.xml加入依赖项
<dependency>
<groupId>com.oneboi.maven01</groupId>
<artifactId>maven01-model</artifactId>
<version>0.0.1SNAPSHOT</version>
</dependency>
完整pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.oneboi.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.oneboi.maven01</groupId>
<artifactId>maven01-model</artifactId>
<version>0.0.1SNAPSHOT</version>
</dependency>
</dependencies>
</project>
四、自动创建目录骨架
使用 manven的archetype插件创建目录
创建目录的两种方式:
方式1:
mvn archetype:generate
按照提示进行选择
选1389 Choose org.apache.maven.archetypes:maven-archetype-quickstart version 再选最新版
Confirm properties configuration:
- groupId: com.oneboi.maven03
- artifactId: maven03-service
- version: 1.0.0SNAPSHOT
- package: com.oneboi.maven03.service
方式2:
参数创建
-
mvn archetype:generate -DgroupId=组织名, 公司网址的反写+项目名 -DartifactId=项目名-模块名 -Dversion=版本号 -Dpackage=代码所存在的包名
方式3:
使用Idea
五、坐标和仓库
构件通过坐标作为其唯一标识
修改镜像仓库位置: E:\maven\apache-maven-3.6.1\conf 打开settings.xml 146行增加
<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>
这个源好像不太行,换成阿里云的可以
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf> *
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
修改默认本地仓库位置 49行增加
<localRepository>E:/maven/repo</localRepository>
将该settings.xml复制到repo文件夹下。
仓库:
本地仓库
中央仓库
六、Maven生命周期和插件
clean 、compile 、test 、package、 install
一个完整的项目构建过程包括:
清理、编译、测试、打包、集成测试、验证、部署
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新增
<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
execution
英 [ˌeksɪˈkjuːʃn] 美 [ˌeksɪˈkjuːʃn]
n.
处决;实行;执行;实施;表演;(乐曲的)演奏;(艺术品的)制作
phase
英 [feɪz] 美 [feɪz]
n.
阶段;时期;月相;(月亮的)盈亏
v.
分阶段进行;逐步做
七、 pom.xml常用元素
pom.xml:maven项目的核心管理文件,用于项目描述、组织管理、依赖管理、构建信息的管理,Pom中包含了许多的标签。
Pom.xml的常用元素:
<project>是pom.xml的根元素,包含了pom的一些约束信息。
<modelVersion>是一个固定的版本,也是必须的元素,指定了当前pom的版本。
坐标的信息由以下标签组成:
<groupId>主项目标识,公司网址+项目名组成</groupId>
注意:maven的项目和实际的项目不是一一对应关系,maven项目体现的是模块化的概念,因此一个实际项目往往会划分成很多的模块。
<artifactId>一个模块的标识,项目名+模块名进行标识</artifactId>
<version>第一个0标识大版本号,第二个0表示分支版本号,第三个0表示小版本号,一般形式可以写为0.0.1snapshot,snapshot快照、alpha内部测试、beta公测、Release稳定、GA版本正式发布<version>。
<packaging>maven项目打包的方式,默认打包是jar,、其他类型war、zip、pom等<packaging>
其他标签:
<name>项目的描述名,一般是在产生对象文档时候才会使用</name>
<url>项目的地址</url>
<description>项目的描述</description>
<developers>开发人员的列表</developers>
<licenses>许可证的信息,比如经常用到的开源框架,它都会有一些许可证的信息</licenses>
<organization>组织信息</organization>
<dependencies>依赖列表
<dependencies>
依赖项(可以包含多个)
依赖项用坐标确定依赖的位置
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type>类型</type>
<scope>依赖的范围(比如上面写的junit的测试范围是test,只在测试的依赖范围内有用,在主代码中引用junit这个类,它就会报错)</scope>
<optional>设置依赖是否可选(默认是false,子项目默认是false时,子项目默认是继承的,如果为true,子项目必须显示的引入该依赖)</optional>
<executions>
排除依赖的传递列表(可以排除多个依赖,比如Ajar包依赖Bjar包,Bjar包又依赖Cjar包,C对于A来说就是传递依赖,如果A不想依赖C,就使用该标签)
<execution></execution>
</executions>
</dependencies>
<dependencyManagementy>依赖的管理</dependencyManagementy>
<dependencies>
<dependency>
</dependency>
</dependencies>
<dependencyManagement>依赖的管理,也可以通过<dependencies>声明依赖列表,通过<dependency>包含多个依赖,但是它并不会被运行,也就是说它不会被引入到实际的依赖当中,该标签一般主要用于定义在父模块中,供子模块继承用的。比如之前多个maven项目中,都使用到junit,我们就可以抽象出一个父类的模块,然后在父类模块中对junit进行一个定义,其他子模块直接继承该父模块即可。
<build>
插件列表
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</plugin>
</plugins>
</build>
<parent>用于子模块对父模块的pom的继承</parent>
<modules>指定多个模块一起编译</modules>
dependencyManagement与dependencies区别
https://www.cnblogs.com/atai/p/6027335.html
https://www.jianshu.com/p/c8666474cf9a
https://blog.csdn.net/liutengteng130/article/details/46991829
八、依赖范围scope
provide
英 [prəˈvaɪd] 美 [prəˈvaɪd]
v.
提供;供应;给予;规定
三种classpath:
- 编译
- 测试
- 运行
- compile:默认的范围,编译测试运行都有效
- provided:在编译和测试时有效
- runtime:在测试和运行时有效
- test:只在测试时有效
- system:与本机系统相关联,可移植性差
- import:导入的范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置
https://blog.csdn.net/leoxyk/article/details/79622507
https://www.cnblogs.com/gyjx2016/p/6794893.html
九、依赖和冲突
依赖的传递:
多个项目依次依赖,A<-B<-C,后面的引入前面的项目坐标 要把前面的项目编译、打包、安装后,后面的项目才能运行build
排除依赖,使用
<exclusions>
<exclusion>
需要排除的依赖的坐标
</exclusion>
</exclusions>
实现依赖上一个项目,需要将该项目的坐标复制到pom.xml中,用<dependency></dependency>包围。
注意:做这步之前需要先将依赖的项目,clean package清理打包,install构建安装到自定义的仓库中。
短路冲突:
1、短路优先 A->B->C->X(jar) A->D->X(jar)
先解析下面的
2、先声明优先
如果路径长度相同,则谁先声明,先解析谁
十、聚合和继承
-
项目的继承 在父类项目中使用dependencyManagement对依赖进行管理,但是并不会使用依赖,子类需要使用parent标签,来引用父类中的依赖,一般可以将版本号在父类中进行声明,子类无需声明版本号,这样可以保证子类和父类版本号一致。
-
项目的聚合 将packaging打包方式改为pom,使用modules标签,引入其他项目
<modules> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
十一、 构建web项目
新建项目,模板选择webapp。
GroupId: com.oneboi.webdemo Artifact Id:webdemo
建成后,新建文件夹
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的下添加
<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服务
标签下
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
run as build clean package
显示Hello World!
使用tomcat同理。
https://hubojing.github.io/2019/08/10/%E5%88%9D%E6%B6%89Maven/
来源:oschina
链接:https://my.oschina.net/2016jyh/blog/4491877