1、管理jar包和它的文档
2、自动下载jar包、文档和源代码
3、管理jar直接的依赖,a.jar需要b.jar,maven会自动下载b.jar
4、管理所需要的jar包的版本
5、编译程序,将java文件编译为class文件
6、测试代码是否正确
7、打包文件,形成jar文件或war文件
8、部署项目
构建是面向过程的,就是一些步骤完成项目代码的编译、测试、运行、打包、部署等。maven支持的构建有:
1、清理:将之前项目编译的东西删除掉,为新的编译代码做准备
2、编译:将程序源代码编译为执行代码,java->class批量的,maven可以同时将成千上百个文件编译为class文件。
3、测试:maven可以执行测试程序代码,验证代码功能是否正确。(批量)
4、报告:生成测试结果的文件
5、打包:将程序中的所有class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序的压缩文件是以jar作为扩展名的,对于web应用,压缩文件的扩展名是war
6、安装:将打包好的jar/war文件安装到本机仓库 7、部署:把程序安装好可以执行
1、pom:一个文件,名称是pom.xml,pom意味项目对象模型。maven把一个项目当做一个模型使用,控制maven构建项目的过程、管理jar依赖
2、约定的目录结构:maven项目的目录和文件的位置是有规定的
3、坐标:是一个唯一字符串,用来表示资源的
4、依赖管理:管理你的项目可以使用jar文件
5、仓库管理(了解):资源存放的位置
6、生命周期(了解):maven工具构建项目的过程就是生命周期
7、插件和目标:执行maven构建的时候用到的工具
8、继承
9、聚合
https://blog.csdn.net/weixin_45890113/article/details/117197183?spm=1001.2014.3001.5501
maven的目录结构是有约定的,约定就是大家都遵循的一个规则,我们新建一个maven工程去观察其目录结构
hello/
----/src
--------/main main下是存放主程序Java代码和配置文件的
------------/java java下存放程序包和包中的java文件的
------------/resources resources下存放Java文件中所要使用的配置文件的
--------/test test下用来放测试程序代码和文件的(不是必要的文件夹)
------------/java java下存放测试用的程序包和包中的java文件的
------------/resources resources下存放测试所用的java文件中所要使用的配置文件的
----/pom.xml pom.xml是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.example</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
在main下的java下新建包cn.edu.wbb,并在其下新建HelloMaven类
HelloMaven.java文件
package cn.edu.wbb;
public class HelloMaven {
public int add(int a , int b) {
return a + b ;
}
public static void main(String[] args) {
HelloMaven helloMaven = new HelloMaven();
int n = helloMaven.add(1,2);
System.out.println(n) ;
}
}
在hello目录下输入 mav compile
命令,编译main目录下的所有.java
文件 ,如图所示(因为我的电脑是用过maven的,没用过maven的话在执行这个命令时会下载一系列的maven所需的文件)
maven工具执行的操作需要很多的插件完成
jar文件,叫做插件,是用来文成某些功能的
C:\Users\26090.m2\repository 这是默认仓库(本机仓库)
登陆本机下的用户名下有一个 .m2 文件夹下的 repository 中
执行 mvn compile 进行编译成功后,会在项目的根目录下生成一个target目录(结果目录),maven编译的Java程序最后的class文件都存放在target目录中
1、修改maven的配置文件,maven安装目录/conf/setting.xml
,现将文件进行备份
2、修改
,将localRepository标签复制出来一份并修改其中内容为你所要保存文件的目录(不要使用中文目录)
仓库是用来存放东西的,存放maven使用的jar和我们项目中使用的jar
maven使用的插件(各种jar)
项目中使用的jar(第三方的工具)
本地仓库:就是个人计算机上的文件夹,存放各种jar
远程仓库:是存放在互联网上的,使用网络才能链接使用的仓库
远程仓库又分为中央仓库、中央仓库的镜像和私服
①中央仓库是最权威的,所有的开发人员都共享使用的一个集中的仓库
②中央仓库的镜像就是中央仓库的备份,在各大洲、重要的城市都存在
③私服是指在公司内部等局域网内使用的,不对外开放
当开发人员需要用到MySQL驱动时,maven首先查本地仓库,本地仓库没找到时去私服进行查找,私服没找到就到镜像中去找,镜像再找不到就到中央仓库找。
基本信息 | ||
---|---|---|
modelVersion | Maven模型的版本,对于Maven2和Maven3来说,它的值只能是4.0.0 | |
groupId | 组织id,一般是公司域名的倒写。格式可以是: 1、域名倒写:例如com.baidu 2、域名倒写+项目名:例如com.baidu.appolo |
|
artifactId | 项目名称,也是模块名称,对应groupId中项目的子项目 | groupId、artifactId、version 三个元素生成了一个Maven项目的基本坐标,在众多Maven项目中可以唯一定位到某个项目。坐标也决定着将来项目再仓库中的路径及名称 |
version | 项目的版本号,如果项目还在开发中,是不稳定版本,通常再版本后面加上-SNAPSHOT version使用三位数字标识,例如1.1.0 |
|
packaging | 项目打包的类型,可以是jar、war、rar、ear、pom,默认是jar | |
依赖 | ||
dependencies和dependency | Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的会依赖很多的jar包,再Maven中,这些jar包就被称为依赖,使用标签dependency来配置,而这种依赖的配置正是通过坐标来定位的 | |
配置属性 | ||
properties | properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为utf-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级 | |
构建 | ||
build | build表示与构建相关的配置,例如设置编译插件的jdk版本 | |
继承 | ||
parent | 再Maven中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖或者相同的组件配置等,也有类似Java的继承机制,用parent声明要继承的父工程的pom配置 | |
聚合 | ||
modules | 在Maven的多模块开发中,为了统一构建整个项目的所要模块,可以提供一个额外的模块,该模块打包方式为pom,并且在其中使用modules聚合的其他模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫Maven聚合。 |
Maven把任何一个插件都作为仓库中的一个项目进行管理,用一组(三个)向量组成的坐标来表示。坐标在仓库中可以唯一定位一个Maven项目。
groupId:组织名,通常是公司或组织域名倒序+项目名
artifactId:模块名,通常是工程名
version:版本号
需要特别注意的是,项目在仓库中的位置是有坐标来决定的:groupId、artifactId和version决定项目在仓库中的路径,artifactId和version决定jar包的名称
一个Maven项目正常运行需要其他项目的支持,Maven会根据坐标自动到本地仓库中进行查找。对于程序员自己的Maven项目需要进行安装才能保存到仓库中。
pom.xml加入依赖的方式:
<!-- junit单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
maven的生命周期:是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署。
对于项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相对应的命令。对于开发者而言仅仅需要掌握一些命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪一阶段,都是从生命周期的最初阶段开始的。
对于程序员而言,无论我们要进行哪个阶段的构建,组件执行相应的命令即可,无需担心它前面的阶段是否构建,Maven都会进行自动构建。这也就是Maven自动化构建工具给我们带来的好处。
maven的命令:是maven独立使用的,通过命令完成maven的生命周期的执行。maven可以使用命令完成项目的清理、编译、测试等等
mvn clean
清理,删除原来编译和测试的目录,即target目录,但是已经install到仓库中的包不会删除
mvn compile
编译主程序,会在当前目录下生成一个target目录,里面存放编译主程序之后生成的字节码文件
mvn test-compile
编译测试程序,会在当前目录下生成一个target目录,里面存放编译测试程序之后生成的字节码文件
mvn test
测试,会生成一个目录
surefire-reports
,保存测试结果
mvn package
打包主程序,会编译、编译测试、测试并按照pom.xml配置把主程序打包生成jar包或war包
mvn install
安装主程序,把本工程打包,并按照本工程坐标保存到本地仓库中
mvn deploy
部署主程序,会把本工程打包,并按照本工程坐标保存到本地仓库中,并且还会保存到私服,还会自动把项目部署到web容器中
maven的插件:maven命令执行时,真正完成功能的是插件,插件就是一些jar文件,一些类。
用的是junit,junit是一个专门测试的框架(工具)。
junit测试的内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)。
<!-- 单元测试的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
推荐的创建类和方法的提示:
1、测试类的名称是 Test+要测试的类名
2、测试的方法名称 test+方法名称
例如要测试HelloMaven中的add()方法
创建测试类TestHelloMaven
public class TestHelloMaven {
@Test
public void testAdd() {
// 测试
}
}
其中testAdd叫做测试方法,它的定义规则:
1、方法是必须是public的
2、方法必须是没有返回值的
3、方法名称是在定义的,但是推荐测试的方法名称 test+方法名称
4、在测试方法上面必须加上 @Test
插件可以在自己的项目中设置,最常用的是maven编译插件,设置项目使用的jdk版本时通过编译插件指定。
pom.xml文件中
中设置
<build>
<!-- 配置插件 -->
<plugins>
<!--- 配置具体的插件 ->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!-- 插件的名称 -->
<artifactId>maven-compiler-plugin</artifactId>
<!-- 插件的版本 -->
<version>3.1</version>
<!-- 配置插件的信息 -->
<configuration>
<!-- jdk版本 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
idea中内置了maven,但我们一般不使用内置的,因为当我们使用idea内置的maven时修改其设置不方便,所有我们通常使用自己安装的maven,需要覆盖idea中的默认的设置,让idea指定maven安装位置等信息。
file — setting — Build,Execution,Deployment — Build Tools — Maven
Maven Home directory : maven的安装目录
User Settings File :maven安装目录conf/setting.xml配置文件
Local Repository : 本机仓库的目录位置
创建maven项目时,会联网下载模板文件,比较大,使用-DarchetypeCatalog=internal
就不用下载,创建maven项目的速度变快
file — New Projects Settings — Setting for New Projects… (2020版idea)
我们可以看到这里的配置还是idea的默认设置,我们将其修改即可
配置完成后我们再去新建maven项目就不用再配置了
File — New — Project — Empty Project
选择Empty Project后点击 next
给空工程命名,点finish
点击 Modules — + — New Module
选择Maven — Module SDK 配置jdk的版本 — 选择一个项目模板,这里我们选的是一个普通的java项目的模板 — next
在定义Name值 — 下面的坐标的三个值可由我们自行指定 — Next
Finish
Maven工程创建完成之后的目录结构,我们可以发现没有resources目录,这是因为我们选择了模板的原因,resource目录需要我们自行添加
鼠标右键选中main目录—new — Directory
弹出一个New Directory,自己选中下方的resources目录即可,test目录也是一样的操作
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 自己的项目的坐标(gav) -->
<groupId>cn.edu.wbb</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- maven构建项目使用的是utf-8,避免中文乱码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 编译java代码使用的jdk的版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- java项目应该运行在什么样的jdk版本上 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 依赖 -->
<dependencies>
<!-- 单元测试的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
public class HelloMaven {
public int add(int a , int b) {
return a + b ;
}
public static void main(String[] args) {
HelloMaven helloMaven = new HelloMaven();
int res = helloMaven.add(10,20) ;
System.out.println("10 + 20 = " + res);
}
}
import org.junit.Assert;
import org.junit.Test;
public class TestHelloMaven {
@Test
public void testAdd() {
HelloMaven helloMaven = new HelloMaven() ;
int res = helloMaven.add(10,20) ;
// 判断结果是否正确
Assert.assertEquals(30,res);
System.out.println("testAdd()方法执行");
}
}
在idea的右侧有一个maven的列表,里面有一系列的关于maven的操作,鼠标双击即可执行
clean
清理
validate compile
编译
test
测试
package
打包
verify
install
安装
site
deploy
部署
Plugins是插件
Dependencies是依赖
刚创建的web的项目结构是这样的,但是我们需要在main目录下加上java目录和resources目录,还是鼠标右键单击main --- New --- Directory
给出的java目录和resources目录的提示,一个一个双击添加即可
要想添加单元测试的目录,需要在src目录下添加一个test目录,并在其下添加java目录和resources目录
右键新建目录所给的提示,添加上去即可
添加完成之后,web项目的结构
<!-- servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- jsp依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("Hello Servlet......");
writer.flush();
writer.close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.edu.wbb.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>
</h2>
<form action="hello" method="get">
<input type="submit" value="访问HelloServlet">
</form>
</body>
</html>
Edit Configurations
— +
— Tomcat Server
— Local
添加Tomcat服务器
配置Tomcat的版本及jre的版本
将ch02-maven项目添加到tomcat服务器中
启动项目进入浏览器,点击按钮得到结果
当我们pom.xml中所写的依赖不能识别时,鼠标右键pom.xml
— Maven
— Reload project
对pom.xml文件进行强制刷新,能解决大部分时候的问题(前提是写对)
点击右侧的Maven
— Reload All Maven Project
Project Structure
— Modules
— +
— Import Module
— 选择要导入的项目 — OK
— 选择导入一个项目 — Maven
— Finish
使用scope表示依赖的范围,其值有compile、test、provided
scope:表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。
例如:junit的依赖范围是 test,只在测试时起作用
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
compile | test | provided | |
---|---|---|---|
对主程序是否有效 | 是 | 否 | 是 |
对测试程序是否有效 | 是 | 是 | 是 |
是否参与打包 | 是 | 否 | 否 |
是否参与部署 | 是 | 否 | 否 |
<properties>
<!-- maven构建项目使用编码,避免中文乱码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 编译代码使用的jdk版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 运行程序使用的jdk版本 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
(1)在
通过自定义标签声明变量(标签名就是变量名)
(2)在pom.xml文件中的其他位置使用${标签名}
来使用变量的值
自定义全局变量一般是自定义版本号,当项目中要使用多个相同的版本号时,先使用全局变量定义,再使用 ${变量名}
<build>
<resources>
<resource>
<directory>src/main/java</directory> <!-- 所在的目录 -->
<includes>
<!-- 包括目录下的.properties,.xml文件都会被扫描到 -->
<include>**/*.properties
**/ *.xml</include>
</includes>
<!-- filtering 选项 false 不启用过滤器,*.properties已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
maven执行编译代码时,会把src/main/resources目录中的文件拷贝到target/classes目录中。对于src/mian/java目录下的非java文件不处理,不拷贝到target/classes目录中
我们的程序有需要把一些文件放到src/main/java
目录中,当我们在执行java程序时,需要用到src/main/java目录中的文件。需要告诉maven在编译src/main/java目录下的程序时,把文件一同拷贝到target/classes目录中,此时就需要在
中加入