前言
了解Maven的具体概念、功能、具体执行步骤以及如何搭建等
本地仓库资源
Maven 具体功能:
maven 是自动化构建工具,可以部署项目;管理jar文件,自动下载jar、文档和源代码;管理jar直接的依赖以及版本;编译程序,把java编译为class;测试代码是否正确;打包文件,形成jar文件或者war文件
具体构建步骤:
构建是面向过程,主要步骤是
清理:把之前项目编译的东西删除掉,为新的编译代码做准备。
- 编译: 把程序源代码编译为执行代码, 把java编译成class文件且是批量的,maven可以同时把成千上百的文件编译为class。这与javac 不一样,javac一次编译一个文件。
- 测试: maven可以执行测试程序代码,验证你的功能是否正确。批量的,maven同时执行多个测试代码,同时测试很多功能。
报告: 生成测试结果的文件,具体文件是测试有无通过。
- 打包: 项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件, 通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war
安装: 把5中生成的文件jar,war安装到本机仓库
- 部署: 把程序安装好可以执行。
核心概念:
①POM :名称是pom.xml(项目对象模型)
maven把一个项目当做一个模型使用
控制maven构建项目的过程,管理jar依赖。
②约定的目录结构 : maven项目的目录和文件的位置都是规定的。
③坐标 : 是一个唯一的字符串,用来表示资源的。
④依赖管理 : 管理项目可以使用jar文件
⑤仓库管理(了解) :资源存放的位置
⑥生命周期 (了解) : maven工具构建项目的过程
⑦插件和目标(了解):执行maven构建的时候用的工具是插件
⑧继承
⑨聚合
1. 安装及配置
从maven的官网下载maven的安装包
- 解压安装包,解压到一个目录,非中文目录
- 子目录 bin :执行程序,主要是mvn.cmd
- conf :maven工具本身的配置文件 settings.xml
配置环境变量
在系统的环境变量中,指定一个M2_HOME的名称, 指定它的值是maven工具安装目录,bin之前的目录 再把M2_HOME加入到path之中,在所有路径之前加入 %M2_HOME%\bin;
- 验证,新的命令行中,执行mvn -v
注意:需要配置JAVA_HOME ,指定jdk路径
具体maven的配置可看我上一篇的文章进行了解
Maven详细配置(全)
2. 核心概念
2.1 约定的目录结构
每一个maven项目在磁盘中都是一个文件夹(项目-Hello)
Hello/
---/src
------/main #主程序java代码和配置文件
----------/java #程序包和包中的java文件
----------/resources #java程序中要使用的配置文件
------/test #测试程序代码和文件的(可以没有)
----------/java #测试程序包和包中的java文件
----------/resources #测试java程序中要使用的配置文件
---/pom.xml #maven的核心文件(maven项目必须有)
类似这样的目录结构,以树为结构
2.2 编译执行
- 在cmd命令行下运用
mvn compile
进行编译,编译src/main目录下的所有java文件的 - cmd下的命令行会出现多个下载文件
Downloading:https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin
等等是因为第一次mvn会下载多个插件,maven工具执行的操作本身需要很多插件(java类,以jar文件结尾)来完成,插件是完成某些具体功能,下载插件的网址涉及中央仓库,后续核心概念会讲到。 - 下载后的插件具体位置放于默认本地仓库中
C:\Users\86135\.m2
仓库具体的具体
编译成功之后会在项目的根目录下生成target
maven编译的java程序,最后的class文件都放在target目录中
2.3 仓库
仓库是存放maven使用的jar和我们项目使用的jar
仓库的分类可以分为本地仓库和远程仓库
本地仓库是个人计算机上的文件夹,存放各种jar
设置本机存放资源的目录位置(设置本机仓库):
- 修改maven的配置文件
/conf/settings.xml
, 先备份 settings.xml - 修改 localRepository 指定目录(不要使用中文目录)
远程仓库是在互联网上的,使用网络才能使用的仓库
远程仓库分为中央仓库、中央仓库的镜像和私服
中央仓库是共享一个集中仓库 。 https://repo.maven.apache.org :中央仓库的地址
中央仓库的镜像是中央仓库的备份, 在各大洲,重要的城市都是镜像
私服是用在局域网不对外公布
仓库的具体使用是不需要人为使用
具体如何运作仓库
比如需要使用mysql驱动,maven首先查本地仓库--->私服--->镜像--->中央仓库,如果某个阶段有,之后会类似递归一样返回调用
2.4 pom文件
- pom是Project Object Model 项目对象模型
- Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂
- 项目打包的类型packaging,可以是 jar、war、rar、ear、pom,默认是 jar
基本信息有坐标和依赖信息等
1.坐标是唯一值在互联网中唯一标识一个项目的
项目在仓库中的位置是由坐标来决定的:groupId、artifactId 和 version 决定项目在仓库中的路径,artifactId 和 version 决定 jar 包的名称
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
具体搜索使用的中央仓库是
中央仓库地址
通过仓库搜索后的驱动配置(以jar包结尾)
2.packaging: 打包后压缩文件的扩展名,默认是jar ,web应用是war 。默认不写是jar包
3.依赖信息:项目中要使用的各种资源说明
dependencies 和dependency ,相当于是 java代码中import
<dependencies>
<!--依赖 java代码中 import -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
4.properties:设置属性
5.build : maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等
2.5 常用命令
通过命令,完成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 容器中) |
2.6 生命周期以及插件
- lifecycle为生命周期
- plugins为插件
- dependencies为依赖信息
maven的生命周期:就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署
maven的插件: maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。
编译插件的配置
<build>
<!-- 配置插件-->
<plugins>
<!-- 配置具体插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!-- 插件名称-->
<artifactId>maven-compiler-plugin</artifactId>
<!-- 插件版本-->
<version>3.8.1</version>
<!-- 配置插件的信息-->
<configuration>
<!-- 代码运行在jdk1.8上-->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2.7 单元测试junit
单元测试(测试方法):用的是junit, junit是一个专门测试的框架(工具)。
测试的是类中的方法,每一个方法都是独立测试的, 方法是测试的基本单位(单元)
== maven借助单元测试,批量的测试你类中的大量方法是否符合预期的==
具体的使用步骤是在pom.xml文件中加入单元测试
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
推荐的创建类和方法的提示:
- 测试类的名称 是Test + 你要测试的类名
- 测试的方法名称 是:Test + 方法名称
例如要测试HelloMaven ,创建测试类 TestHelloMaven
@Test
public void testAdd(){
测试HelloMaven的add方法是否正确
}
其中testAdd叫做测试方法,它的定义规则
1.方法是public的,必须的
2.方法没有返回值, 必须的
3.方法名称是自定义的,推荐是Test + 方法名称
4.在方法的上面加入 @Test
举个列子:
在main的函数中
public class HelloMaven {
public int add(int n1,int n2){
return n1+n2;
}
public static void main(String args[]){
HelloMaven hello = new HelloMaven();
int res = hello.add(10,20);
System.out.println("10+20="+res);
}
}
测试类应该这样书写
public class MyTest {
@Test
public void testAdd(){
System.out.println("执行 HelloMaven 类 addNumber()方法");
HelloMaven hello =new HelloMaven();
int res = hello.add(n1,n2);
// 期望值,实际值.如果两个值相等则为正确的,不等就会抛出异常,会出错
Assert.assertEquals(30,res);
}
}
具体 Assert.assertEquals
的参数设置可以查看我上一篇文章
java之Assert.assertEquals详细分析
3. 结合idea
3.1 设置maven
idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自个安装的maven,覆盖idea默认的设置,让idea指定maven的安装具体位置
- Maven Home path: maven的安装目录
- User Settings File : maven安装目录conf/setting.xml配置文件
- Local Repository : 本机仓库的目录位置
修改设置为自已安装的maven
在将Runner设置jre为1.8且在VM Options中设置一个参数,参数为-DarchetypeCatalog=internal
。新建的时候就回会比较快,是因为模式联网用maven的时候会下载一个7M的东西,添加参数会不下载且比较快。
配置以后的新工程设置都是maven的
在老版的idea中用file--other settings--Settings for New Project
在新版的idea中为
3.2 新建javase项目
具体idea版本不一样,界面稍微不太一样,不过大同小异
常用的目录结构已经创建好
使用模板创建maven项目,以下的模板没有resources
具体创建之后的目录结构为
蓝色为java文件,绿色为测试文件,添加后的resources需要设置为
讲解pom.xml的其他配置信息
以下为项目信息name以及通过网址访问的url项目,可用可不用
3.3 创建web工程
新建的项目默认目录是
需要新建一些java和resources的目录以及做一些标记
查看pom.xml下的文件
web下默认是war后缀的包
<groupId>org.example</groupId>
<artifactId>8.6ceshi</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
- 以下的name为项目名,url为访问项目的网站,暂时没用到可以删除
- 默认jdk为1.8,将其修改为1.8
以下build为插件的信息,即插件的管理。具体列出来与不列出来之后都会生成,主要是为了方便版本配置,可以删除
具体有清楚插件、资源插件、编译插件、生成报告插件、打包插件、安装插件、部署插件等
此时大概已经配置完毕
对比maven的好处:
以前写servlet的时候需要在dependencies中加入tomcat等信息
现在只需要用maven的管理即可,在pom.xml下加依赖信息即可
比如servlet和jsp的依赖信息
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
3.4 常用技巧
1. 刷新pom.xml
pom文件加入依赖后,有下划线,代表还未更新到,需要刷新
可以通过点击pom.xml右键进行刷新
或者在maven的项目中进行刷新
2.更新目录文件为测试或者跟目录权限等
或者点击工程目录中的
3.导入一个存在的项目
如果本身项目有pom.xml,则需设置为maven
在设置中进行添加模块
导入的项目为maven
jdk设置为1.8
4. 其他细节信息
4.1 依赖范围
有无此功能 | compile | test | provided |
---|---|---|---|
对主程序是否有效 | 是 | 否 | 是 |
对测试程序是否有效 | 是 | 是 | 是 |
是否参与打包 | 是 | 否 | 否 |
是否参与部署 | 是 | 否 | 否 |
依赖范围:使用scope表示的
scope的值有 compile, test, provided ,默认是compile
使用的范围是在maven构建项目的那些阶段中起作用
maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
比如
//该代码在test中才测试有效
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
如果是provided 则为提供者
代表编译测试用的jar包,但是项目进行打包安装的时候不需要这个jar包
比如下方的servlet包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
4.2 常用属性
<properties>
设置maven的常用属性
在maven的全局变量中
可以自定义属性
- 在
<properties>
通过自定义标签声明变量(标签名就是变量名) - 在pom.xml文件中的其它位置,使用
${标签名}
使用变量的值
自定义全局变量一般是定义 依赖的版本号, 当你的项目中要使用多个相同的版本号,先使用全局变量定义, 在使用${变量名}
比如以下这行代码
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<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>
将其修改为全局变量,如果版本号一致的有多个,可以统一一起修改而不繁琐
<junit.version>4.11</junit.version>
<version>${junit.version}</version>
完整代码演示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
4.3 资源插件
- 默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中,对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中
- 要想加入其他非java文件进行处理,需要添加以下代码,在build中加入其resources
把扩张名为xml和properties中都扫描到
并且之后生成都放到target/classes目录中
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>