Maven基础概念
坐标
Maven使用坐标来确定具体需要的JAR包,其坐标包括:
-
groupId:公司或组织的id(一般为公司组织域名的倒序,通常会加上项目名称,如:com.maven)
-
artificatId:一个项目或者是项目的一个模块的id
-
version:版本号(SNAPSHOT表示快照、RELEASE表示正式版本)
Maven中坐标与文件夹的对应关系:
例如:
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
就要在如下文件夹目录找:
maven仓库文件夹\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
Maven项目的初始生成
使用如下命令在cmd对应文件夹目录下可以生成一个maven项目
mvn archetype:generate
该命令执行之后,会让你选择安装模式,直接回车就行(会默认选择7,快速开始)
之后要输入groupId:com.qinghe.maven
artificateId:pro01-maven-java
version直接回车
package也直接回车
再直接回车表示确定创建
创建成功实例:
将pom.xml中自带的jnuit版本改为4.12
自动生成的main和test下的App.java可以删除
POM.xml文件解读
project标签,跟标签,代表对当前项目进行配置、管理
<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标签,从Maven2开始就固定为4.0.0
<modelVersion>4.0.0</modelVersion>
坐标信息
其中,packaging信息代表打包方式,取值为jar代表这是一个Java工程,取值为war代表这是一个web工程,取值为pom代表这是一个管理其他工程的工程。
<groupId>com.qinghe.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
properties标签:
properties标签代表在Maven中定义的属性值,例如build.sourceEncoding就代表在构建时使用的字符集
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
dependencies标签:
dependencies标签代表依赖信息,通过该标签来导入Jar包
里面的dependency标签代表每一个依赖的信息(坐标)
其中的scope标签代表着依赖的作用范围
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
Pom文件结构
POM是指项目对象模型,学习Maven其实就是学习POM.xml的配置
Maven项目的目录结构(该目录结构由超级Pom生成,一般不进行修改)
MavenPro Maven工程所在文件
src 源码整体目录
main 主题程序目录
java Java源代码
com package目录(代码存放目录)
resources 配置文件目录
test 测试程序目录
java Java源代码(测试)
com package目录(测试)
一个小测试,在测试类中添加如下文件(CaculatorTest.java),注意该例子只是为了学习静态引入与测试实例的体会,不作为具体的内容。
package com.qinghe.maven;
import org.junit.Test;
import com.qinghe.maven.Calculator;
//静态引入,使用static进行import的类,不需要在下文前面的使用中加上类名。
import static org.junit.Assert.*;
public class CalculatorTest {
@Test
public void testSum() {
Calculator calculator = new Calculator();
int actualResult = calculator.sum(5, 3);
int expectedResult = 8;
//调用的Assert类中的断言方法,若两个形参相等,则测试通过,不抛出异常,若不相等则抛出异常,测试不通过。
//因为使用了静态引入所以不需要加类名也不需要创建对象
assertEquals(expectedResult, actualResult);
}
}
Maven命令
Maven的命令必须在Pom.xml所在的文件夹下执行
编译
主程序编译:mvn compile
测试程序编译:mvn test-compile
主体程序编译结果存放的目录:target/classes
测试程序编译结果存放的目录:target/test-classes
执行编译之后会生成target目录,其中会存放编译之后的字节码文件等。
清理
mvn clean
会删除编译生成的target文件夹,达到清除编译生成的文件的效果。
测试
mvn test
该命令会运行test文件夹下的java文件,若文件没有编译,则会进行编译。
打包
mvn package
该命令会将java程序打包,java打jar包、web程序打war包,会存放在target中。
安装
mvn install(mvn clean install)
安装操作会将项目的jar包存入本地Maven仓库(根据POM.xml的坐标)。
安装操作也会将该项目中的POM.xml文件会变成jar包中的.pom文件。
生成Web工程的方式
生成Web项目的操作:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
这样的生成不会生成java文件夹,要在main文件夹下新建java/com/qinghe/maven的文件夹。
Jar包的下载:
https://mvnrepository.com
在该网站上进行jar包的搜索,并将依赖信息粘贴到POM.xml的依赖信息处就可以完成jar包的下载
在进行编译之后要进行打包(war包)和安装的操作
将打包之后的target文件夹下的.war文件放到tomcat文件夹下的webapps文件夹下即可完成部署,再访问对应的目录即可完成对网页的访问。
让web工程依赖java工程
只有web工程依赖java工程,没有java工程依赖web工程,即war包里面可以有jar包,jar包里面不能有war包。
在POM.xml文件中添加dependency依赖就会令web项目依赖于某个java项目,在后续的使用中,就和项目中本身就存在这个java项目的效果一致(实现了导入jar包的效果)
使用 mvn dependency:list
或mvn dependency:tree
可以查看当前项目的依赖信息。
依赖的生效范围
依赖的生效范围由scope标签决定,而scope标签的取值一般可以有:
compile / test / provided / system / runtime / import
compile在main目录、test目录、开发过程中、部署到服务器的过程中都是有效的,99%的依赖作用范围都是compile
test在main目录下是无效的,并且在部署到服务器的过程中无效
provided在部署到服务器的过程中是无效的(不会打在war包中,例如servlet-api在服务器中是自带的,不需要引入依赖代入到war包中)(若重复会有隐患,可能会有jar包冲突导致的一系列问题)
依赖的生效范围
A依赖于B,B依赖于C,若B与C之间的依赖关系为compile,则A与C之间的依赖可以被传递过来,而若为test或provided则不能传递过来。
例如:sprintboot、springcloud就利用了依赖的传递性来简化对依赖的管理。
依赖的排除
当一个jar包因为依赖的传递性同时依赖了同一个jar包的不同版本,则会对项目有很大的隐患,这个时候就要用到依赖的排除,将不需要的哪个版本的依赖进行约束,使其不要传递进来。
示例:
<dependency>
<!-- 这里是某个依赖的信息 -->、
<!-- 在exclusion标签中进行依赖排除信息的配置,使用坐标确定要排除的jar包信息,不需要配置版本号 -->
<exclusioin>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</dependency>
继承
Maven工程之间,A工程继承B工程,本质上是A工程中的POM.xml中的配置继承了B工程中的POM.xml的配置。
这种继承关系便于在父工程中统一管理配置信息。
操作
注:只有打包方式为pom的maven工程才可以作为父工程。
在生成maven工程之后,在生成工程的POM.xml中修改打包方式为pom。
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>
<groupId>com.qinghe.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 作为父工程,修改打包方式 -->
<packaging>pom</packaging>
<name>pro03-maven-parent</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
之后进入pro03-maven-parent中再进行构建其他maven模块
在创建了子模块后,在父工程的POM.xml会自动生成如下代码
<modules>
<module>pro04-maven-module</module>
<module>pro05-maven-module</module>
<module>pro06-maven-module</module>
</modules>
而子模块中会改变为如下代码:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<!-- 父工程的坐标 -->
<parent>
<groupId>com.qinghe.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 若子工程的groupId与父工程相同,则可以省略(一般都相同) -->
<groupId>com.qinghe.maven</groupId>
<!-- 这个不可以省略-->
<artifactId>pro04-maven-module</artifactId>
<!-- 若子工程的version与父工程相同,则也可以省略 -->
<version>1.0-SNAPSHOT</version>
<name>pro04-maven-module</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
在父工程中管理依赖
在父工程中使用如下标签进行管理(project标签下)。
<dependencyMangement>
<dependencies>
<dependency>
</denpendency>
</dependencies>
</dependencyMangement>
在父工程中管理的jar包。在子工程中也需要进行声明
</dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 此处的版本号可以省略,若版本一定要与父工程统一管理的不同,也可以进行修改 -->
<!-- 在此处的版本号会覆盖掉父工程中统一管理的版本号 -->
<version>4.0.0.RELEASE</version>
<dependency>
配置自定义属性
在properties标签下进行配置:
<!-- 标签和属性都可以自定义,相当于 String qinghe.spring.version = 4.2.0.RELEASE -->
<qinghe.spring.version>4.2.0.RELEASE</qinghe.spring.version>
在之后的使用要用如下配置:
<version>${qinghe.spring.version}</version>