Maven入门
一、概述
Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构件,报告和文档的软件项目管理工具。
- 构建工具:项目相关的源码及资源 - jar、war - 构建
- 依赖管理工具:自动下载、依赖、管理构建(jar)的工具
1、构建
Maven是一个优秀的构建工具。 它能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,我们要做的是使用Maven配置好项目,然后输入简单的命令(如:mvn clean install
),Maven会帮我们处理那些烦琐的任务。
Java 项目开发过程中,构建指的是使用原材料生产产品的过程。
构建过程包含的主要的环节:
- 清理:删除上一次构建的结果,为下一次构建做好准备
- 编译:Java 源程序编译成 *.class 字节码文件
- 测试:运行提前准备好的测试程序
- 报告:针对刚才测试的结果生成一个全面的信息
- 打包
- Java工程:jar包
- Web工程:war包
- 安装:把一个 Maven 工程经过打包操作生成的 jar 包或 war 包存入 Maven 仓库
- 部署
- 部署 jar 包:把一个 jar 包部署到 Nexus 私服服务器上
- 部署 war 包:借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器上
脱离IDE环境构建项目
2、依赖
Maven还是一个依赖管理工具和项目信息管理工具。它提供了中央仓库,能帮我们自动下载构件。
如果 A 工程里面用到了 B 工程的类、接口、配置文件等等这样的资源,那么我们就可以说 A 依赖 B。例如:
- junit-4.12 依赖 hamcrest-core-1.3
- thymeleaf-3.0.12.RELEASE 依赖 ognl-3.1.26
- ognl-3.1.26 依赖 javassist-3.20.0-GA
- thymeleaf-3.0.12.RELEASE 依赖 attoparser-2.0.5.RELEASE
- thymeleaf-3.0.12.RELEASE 依赖 unbescape-1.1.6.RELEASE
- thymeleaf-3.0.12.RELEASE 依赖 slf4j-api-1.7.26
依赖管理中要解决的具体问题:
- jar 包的下载:使用 Maven 之后,jar 包会从规范的远程仓库下载到本地
- jar 包之间的依赖:通过依赖的传递性自动完成
- jar 包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
二、安装与配置
第一:下载、解压到指定位置(不要有中文路径)
前提:必须安装好JDK,以及配置好JDK的环境变量
第二:配置环境变量
MAVEN_HOME:安装目录 – XXX_HOME
Path:%MAVEN_HOME%\bin
第三:测试是否安装成功
$ mvn -v
三、Maven配置
打开核心配置文件:Maven安装目录/conf/settings.xml
建议在配置之前,可以备份一下 settings.xml 文件
1、配置本地仓库
<!-- 配置本地仓库 --> <localRepository> D:\java\localRepository </localRepository>
2、配置镜像仓库
<!-- 阿里云Maven镜像配置 --> <mirrors> ... <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun.</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
1、下载
http://maven.apache.org/download.cgi
2、安装
1)解压到指定目录
注意:
- Maven依赖于Java,因此必须保证已经安装JDK,并配置好环境变量
- 路径不要存在中文或空格
2)配置环境变量
- MAVEN_HOME或M2_HOME:指定Maven根目录
- Path:指定Maven相关的命令程序所在的bin目录
2.1)Linux或Mac
# 编辑用户目录下的.bash_profile文件
$ vim .bash_profile
########### Maven1.0 Evn ##################
# export MAVEN_HOME=/Users/circleus/apache-maven-3.5.4
# export MAVEN_HOME=/Users/circleus/aliyun-maven-3.6.0
# export PATH=$MAVEN_HOME/bin:$PATH
########### Maven2.0 Evn ##################
# export M2_HOME=/Users/circleus/aliyun-maven-3.6.0
# export M2_HOME=/Users/circleus/apache-maven-3.5.4
# export PATH=$PATH:$M2_HOME/bin
########### Maven3.0 Evn ##################
# export PATH=/Users/circleus/aliyun-maven-3.6.0/bin:$PATH
2.2)windows
- MAVEN_HOME:
d:\java\apache-maven-3.6.3
- Path:
%MAVEN_HOME%\bin
3)测试
$ mvn -v
4)目录结构
- bin目录:包含mvn的运行脚本
- boot目录:包含一个类加载器的框架,maven使用它加载自己的类库
- conf目录:存放配置文件的目录(核心配置文件settings.xml文件)
- lib目录:包含maven运行时的依赖类库
3、配置
1)配置本地仓库
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>/Users/zing/java/local-repository</localRepository>
2)镜像仓库
<!--阿里云Maven镜像配置-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun.</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4、常用命令
- mvn
- -v :查看maven版本
- compile:编译
- package:打包
- test:测试
- clean:清除target
- install:安装jar包到本地仓库中
三、创建Maven项目
1、手工创建
1、命令行的方式创建
1)纯手工
第一:创建项目 - 遵循 Maven 项目的结构
第二:配置 pom.xml 文件
注意:pom.xml是Maven项目的核心配置文件
<!-- 当前项目坐标:GAV --> <groupId>com.nf.ums</groupId> <artifactId>ums-user</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
第三:编写代码
后台代码:java
前端代码:webapp目录下,html、jsp、图片…
第四:编译
$ mvn compile $ mvn clean compile
注意:
- 在DOS命令行中,必须进行到项目的根目录
- 编译成功后,在项目根目录生成一个target目录
- 同时,在本地仓库中,下载了相关的依赖
- 第一次执行maven命令时,maven会下载对象的插件
第五:使用构件
- Java项目 - jar -其它项目通过GAV依赖jar
- Javaweb项目 - war - 部署到WEB赋值中运行(Tomcat)
$ mvn package
2)脚手架
1)Maven项目目录结构
要遵循Maven项目目录结构的规范(webapp)- 否则需要添加插件maven-war-plugin.
- 项目名称
- src:项目源码
- main:存放主程序
- java:存放Java源码
- 包名+类名
- resoures:存放资源文件
- webapps:web资源
- WEB-INF
- java:存放Java源码
- test:存放测试程序
- java:存放Java测试源码
- 包名+类名
- resources:存放资源文件
- java:存放Java测试源码
- main:存放主程序
- target:此目录由maven生成
- pom.xml:Maven项目核心配置文件
- src:项目源码
2)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>
<!-- 当前项目坐标:GAV - 便于被别人使用(依赖)-->
<groupId>edu.nf</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<url>http://maven.apache.org</url>
<!-- 属性配置 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖配置:依赖第三方的jar包 -->
<dependencies>
<!-- 依赖 junit:测试工具-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 依赖 javax.servlet-api开发,Javaweb程序 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
说明:
-
GAV:项目坐标。用于定位,便于被别人依赖,也就是说,jar包通过GAV定位依赖到项目中。
-
groupId:包名(公司或组织域名倒序).项目名
-
artifactId:项目名-模块名
-
version:指定版本
-
packaging:指定项目的包的方式,默认是jar,可以为
- jar:java项目
- war:web项目
- pom:父项目,用于管理各子项目
<groupId>公司或组织域名倒序.项目名</groupId> <artifactId>项目名-模块名</artifactId> <version>x.x.x-yyyy</version> <!-- 第一个x表示大版本号 第二个x表示分支版本号 第三个x表示小版本号 yyyy可以指定为: snapshot:快照 alpha:内部测试 beta:公测 release:稳定 GA:正式发布 -->
-
dependencies:依赖列表,指定本项目所依赖的第三方工具(构件/jar)
构件搜索网址:https://mvnrepository.com/
-
archetype插件——自动创建符合maven规定的目录骨架
-
方法一:
mvn archetype:generate
-
方法二:
mvn archetype:generate -DgroupId=组织名(公司网址的反写+项目名) -DartifactId=项目名-模块名(唯一的标识) -Dversion=版本号 -Dpackage=代码所存在的包名 mvn archetype:generate -DgroupId=org.nf.sms -DartifactId=sms-entity -Dversion=1.0-SNAPSHOT -Dpackage=org.nf
-
第一次构建需要连接网络,从官网下载相关的插件
-
可以配置国内镜像解决
-
2、Eclipse创建
1)在src/main/java/com/maven/demo目录下新建文件User.java
package com.maven.demo;
public class User{
public String sayHello() {
return "hello" ;
}
}
2)在src/main/java/com/maven/demo目录下新建文件UserTest.java
package com.maven.demo ;
import org.junit.* ;
import org.junit.Assert.* ;
public class UserTest {
@Test
public void testHello() {
Assert.assertEquals("hello",new User().sayHello()) ;
}
}
3)配置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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maven.demo01</groupId>
<artifactId>demo01-entity</artifactId>
<version>0.0.1SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
eclipse创建maven项目时指定默认的JRE(默认是1.5的)
修改settings.xml文件
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
3、IDEA创建
maven项目的设置:
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.nf</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- war打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>web</warSourceDirectory>
<!-- 指定web.xml路径 -->
<webXml>web\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
例子:Javaweb项目依赖Java项目
<!-- 依赖demo-java项目 -->
<dependency>
<groupId>org.nf.demo</groupId>
<artifactId>demo-java</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
四、JUnit
1、概念
JUnit是一个用于Java编程语言的测试框架,可以帮助开发人员编写自动化的单元测试和集成测试。
2、使用步骤
第一:在项目中添加JUnit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
第二:创建一个测试类,该类应该包含一些测试方法。在测试类中使用@Test
注解来标识测试方法。
package com.maven.demo ;
import org.junit.* ;
import org.junit.Assert.* ;
public class UserTest {
@Test
public void testHello() {
// 断言验证测试结果是否符合预期
Assert.assertEquals("hello",new User().sayHello()) ;
}
}
第三:在测试方法中编写测试代码。可以使用断言来验证测试结果是否符合预期。例如,使用assertEquals()
方法来比较实际值和期望值。
第四:运行测试。可以使用IDE工具来运行测试,也可以使用Maven或Gradle等构建工具来运行测试。测试运行后,将会显示测试结果和测试覆盖率等相关信息。
3、常用API
1)@Test
注解:用于标识一个测试方法。例如:
@Test
public void testAddition() {
int result = Calculator.add(2, 3);
assertEquals(5, result);
}
2)assertEquals()
方法:用于比较实际值和期望值是否相等。例如:
int result = Calculator.add(2, 3);
assertEquals(5, result);
3)assertTrue()
和assertFalse()
方法:用于验证一个条件是否为真或为假。例如:
boolean flag = Calculator.isPositive(5);
assertTrue(flag);
flag = Calculator.isPositive(-5);
assertFalse(flag);
4)assertNotNull()
和assertNull()
方法:用于验证对象是否为空或不为空。例如:
String str = Calculator.getString();
assertNotNull(str);
str = null;
assertNull(str);
5)@Before
和@After
注解:用于标识测试方法之前和之后要执行的方法。例如:
@Before
public void setUp() {
// 初始化测试数据
}
@After
public void tearDown() {
// 清理测试数据
}
6)@BeforeClass
和@AfterClass
注解:用于标识所有测试方法之前和之后要执行的方法。例如:
@BeforeClass
public static void setUpClass() {
// 初始化测试数据
}
@AfterClass
public static void tearDownClass() {
// 清理测试数据
}
7)@Ignore
注解:用于标识某个测试方法需要被忽略。例如:
@Ignore("这个测试方法还没准备好")
@Test
public void testSomething() {
// 测试代码
}
五、Lombok
Lombok是一个Java库,它可以通过注解自动化Java类的样板代码,从而简化开发人员的编程任务。
1、@Data
注解
使用@Data注解可以自动生成JavaBean所需的getter、setter、toString、equals和hashCode方法。
@Data
public class Person {
private String name;
private int age;
}
2、@AllArgsConstructor
和@NoArgsConstructor
注解
使用@AllArgsConstructor和@NoArgsConstructor注解可以自动生成有参构造函数和无参构造函数。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private int age;
}
3、@Builder
注解
使用@Builder注解可以自动生成Builder模式所需的代码,可以方便地创建复杂对象。
@Data
@Builder
public class Person {
private String name;
private int age;
private String address;
}
Person person = Person.builder()
.name("张三")
.age(20)
.address("北京市")
.build();
第一:在IDEA中,安装 Lombok 插件
第二:在 Maven 项目中,添加 Lombok 依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency>
第三:使用 Lombok
提供相关的注解
tructor
@NoArgsConstructor
public class Person {
private String name;
private int age;
}
3、`@Builder`注解
使用@Builder注解可以自动生成Builder模式所需的代码,可以方便地创建复杂对象。
```java
@Data
@Builder
public class Person {
private String name;
private int age;
private String address;
}
Person person = Person.builder()
.name("张三")
.age(20)
.address("北京市")
.build();
第一:在IDEA中,安装 Lombok 插件
第二:在 Maven 项目中,添加 Lombok 依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency>
第三:使用 Lombok
提供相关的注解