一、Maven是什么?
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理;Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。
在创建Java项目时会使用第三方类库,需要引入许多jar包,一个jar包有时又会引用其他的jar包;jar包之间的依赖复杂且十分繁琐,Maven就是帮我们管理这些复杂的依赖关系,快速构建一个项目。
二、Maven安装与配置
菜鸟教程Maven 环境配置:https://www.runoob.com/maven/maven-setup.html
三、Maven使用
Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。
基本命令
-
-v:查询Maven版本,检查maven是否安装成功。
-
compile:编译,将java源文件编译成class文件
-
clean:删除target文件夹
-
package:项目打包
-
test:测试项目,执行test目录下的测试用例
-
install:安装,将当前项目放到Maven的本地仓库中
构建Java项目
要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件
mvn archetype:generate -DgroupId=com.csdn.demo -DartifactId=springExample -DarchetypeArtifactId=maven-archetype-quickstart
参数说明:
- -DgourpId: 组织名(也是包的目录结构),公司域名的反写 + 项目名称
- -DartifactId: 项目名-模块名
- -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart,创建一个简单的 Java 应用
- -DinteractiveMode: 是否使用交互模式 true / false
输入命令之后,maven 会提示我们输入版本号,这里可以直接定义版本号也可以直接回车,接着 maven 会提示当前要创建项目的基本信息,输入 y 然后回车确认。
此时项目已创建好,可以在pom.xml中添加依赖开始开发了。
用Maven执行程序
这里用 maven 执行 java 程序,-Dexec.mainClass
参数指定 main 方法所在类。(注:修改文件后都要使用 mvn compile 重新编译,然后再运行)
mvn compile
mvn exec:java -Dexec.mainClass="com.csdn.demo.App"
常用Archetype
maven-archetype-quickstart 默认的Archetype,基本内容包括:
- 一个包含junit依赖声明的pom.xml
- src/main/java主代码目录及一个名为App的类
- src/test/java测试代码目录及一个名为AppTest的测试用例
maven-archetype-webapp 一个最简单的Maven war项目模板,当需要快速创建一个Web应用的时候可以使用它。生成的项目内容包括:
- 一个packaging为war且带有junit依赖声明的pom.xml
- src/main/webapp/目录
- src/main/webapp/index.jsp文件
- src/main/webapp/WEB-INF/web.xml文件
Maven仓库
项目中依赖的第三方库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件;Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
maven请求构建时,先请求本地仓(存在则直接在本地仓库获取),如果配置了远程仓库私服,则请求私服;私服中没有找到则继续请求中央仓库(由 Maven 社区提供的仓库,其中包含了大量常用的库),找到后会在本地仓库缓存一份,如果在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。
阿里云仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
第二步:pom.xml文件里添加:
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
Maven坐标
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
如下代码中,groupId 和 artifactId 构成了一个Jar包的坐标:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
- groupId:所需Jar包的项目名
- artifactId:所需Jar包的模块名
- version:所需Jar包的版本号
-
packaging (可选):定义项目打包方式(默认构建成jar)
maven坐标查询网址:
聚合
将多个项目同时运行就称为聚合,只需在pom中作如下配置:
<modules>
<module>module-nameA</module>
<module>module-nameB</module>
</modules>
继承
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom。
- 父pom配置:(父模块的打包方式必须为pom)
<groupId>com.companyname.groupname</groupId>
<artifactId>Root</artifactId>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
- 子pom配置:
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>