maven的配置及使用
一、maven
1 简介
项目管理工具
项目对象模型project object model(pom)
一个项目:清理,编译,测试,打包,发布,部署
1.1.1 java构建工具的发展史
make: 编写makefile
Ant: Apache
maven:使用量较高
gradle:安卓端使用较多
bazel:
1.1.2 maven能做什么
- 管理jar包
- 构建项目:自动完成 (清理,编译,测试,打包,发布,部署)
- 项目的拆分与聚合
1.1.3 为什么使用maven
- IDE(继承开发环境)不是万能的,依赖大量的手动操作,编译,测试,代码生成,这些工作是相互独立的,很难一键自动操作
- 很难统一所有IDE的配置
1.1.4 maven对jar文件的管理
没有maven之前,自己对jar包的下载,匹配版本,jar包重复使用,考虑jar包之间依赖的问题
2. maven应用
2.1 下载和安装
官网: https://maven.apache.org/
下载:https://dlcdn.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.zip
解压后的目录
bin:存放maven指令
boot:存放类加载器框架
conf:存放配置文件
lib:存放第三方jar包
安装
环境变量配置
maven_home
path路径
检验环境配置是否成功
mvn -v
配置jdk版本
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<JAVA_HOME>C:\Users\hison\.jdks\corretto-11.0.17</JAVA_HOME>
</properties>
2.2 maven的项目结构
不同的ide(继承开发环境),目录结构不同,导致不能直接将不同IDE开发的项目进行导入。
maven项目的目录结构是统一的
maven项目结构
mvn_app
--pom.xml
--src
--main
--java : 源代码的根
--com
--mycompany
--app
--App.java
--resources:资源和配置文件的根
--test
--java : 测试程序的根
--com
--mycompany
--app
--App.java
--resources:测试所需资源和配置文件的根
在app下创建一个APP.java文件
public class APP{
public static void main(String[] args) {
System.out.println("hello world");
}
}
pom.xml 文件参考https://maven.apache.org/pom.html
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycpmpany</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</project>
在pom.xml文件上一级目录下运行cmd,执行mvn compile指令,执行成功后会生成target目录,下面有classes文件,存放编译后的.class文件
2.3 maven使用概念
2.3.1 仓库
用于存放jar文件,以及各种资源
全球中央仓库地址https://repo1.maven.org/maven2/
https://repo.maven.apache.org/maven2/
仓库分为本地仓库和远程仓库
本地仓库:电脑上的文件夹
远程仓库:
- 私服:公司内部或部门用到的仓库,开发的功能,只在公司内部使用。版权问题(Oracle数据库驱动)
- 全球中央仓库:存储所有的jar文件资源
2.3.2 配置本地仓库
打开maven解压目录下的conf -> settings.xml配置文件
默认是在当前用户 -> .m2 -> repository
在其他盘符下创建一个目录
重新编辑
2.3.3 配置全球中央仓库镜像
conf -> settings.xml配置文件
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
2.3.4 maven坐标
定位仓库中资源的位置
组成:
groupId:组织名称,公司名,团体名,通常是域名的反向写法(com.mycompany)
artifactId:项目名称或模块名称(app)
version:项目版本号(主版本号.次版本号.小版本号)。SHAPSHOT(快照)
2.4 依赖
依赖查找的网站:https://mvnrepository.com/
pom.xml 文件中加入对应的依赖
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
创建一个类,里面有一个方法,执行加法运算
package com.mycompany.app;
public class AddMethodP{
public int add(int x,int y){
return x+y;
}
}
创建单元测试类,在src -> test -> java下面创建
package com.mycompany.app;
import org.junit.Test;
import org.junit.Assert;
public class AddMethodTest{
@Test
public void testAdd(){
AddMethod m = new AddMethod();
int result = m.add(10,10);
Assert.assertEquals(20,result);
}
}
2.5 生命周期,插件和指令
mvn clean: 清理命令,将生成的target目录做删除,清除编译过的数据
使用插件: maven-clean-plugin:2.5:clean
mvn compile:编译指令,将java源文件做编译,编译成class文件,将class文件放在target/classes下面
使用插件:
maven-resources-plugin:2.6 资源文件处理插件:将src/main/resources/下面的文件复制到target/classes目录下
maven-compiler-plugin:3.1 执行编译的插件
mvn test-compilet: 编译测试文件的,将src/test/java下的文件复制到target/test-classes目录下
如果之前没有compile源码,会自动执行compile
使用插件:
maven-resources-plugin:2.6 资源文件处理插件:将src/main/resources/下面的文件复制到 target/classes目录下
maven-compiler-plugin:3.1 执行编译的插件
mvn test : 执行测试,拿到测试结果,生成测试报告
执行多个测试类
mvn test -Dtest=com.xzit.app. (包名.*)*
使用插件:
maven-surefire-plugin:2.12.4 生成报告,会生成在surefire-reports目录下有两种文件,
一种是txt文件,
一种是xml(测试环境和结果)
mvn package:执行打包操作,jar war pom
使用插件:
maven-jar-plugin:2.4:jar:打包插件,生成jar文件
jar文件名字的生成: artifactId-version.packaging
mvn install:执行安装,将生成的jar文件 存放在本地仓库
使用插件: maven-install-plugin:2.4 将jar文件存放在本地仓库
mvn deploy:执行部署操作
2.6 三套项目构建周期
clean: 清理工作
- pre-clean:清理之前完成
- clean:完成清理,移除上次构建的目录或文件
- post-clean:clean之后要完成的工作
default : 项目构建的核心工作 编译,测试编译,测试,打包,安装
site:产生报告,发布站点
- pre-site:生成站点文档之前要完成的工作
- site:成成项目站点文档
- post-site:生成站点文档之后要完成的工作
- site-deploy:将生成的站点部署在服务器上
使用mvn sit 指令生成站点文档,需要在pom文件中配置插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
<configuration>
<locales>zh_CN</locales>
</configuration>
</plugin>
</plugins>
</build>
插件应用处理
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
<goal>test-jar</goal>
</goals>
<!-- 在哪个阶段生成 -->
<phase>test-compile</phase>
</execution>
</executions>
</plugin>
2.7 使用ArcheType创建maven工程
ArcheType是Maven项目模板工具箱。
mvn archeType:generate
-Dgroupld = 组织结构名称
-Dartifactld = 项目名称
-Dversion = 版本号
-DarcheTypeArtifactId=原型工具
-DinteractiveMode=false //是否开启交互模式
创建一个java项目
mvn archetype:generate -DgroupId=com.xzit -DartifactId=mvn-demo -Dversion=1.0
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
创建一个web项目
mvn archetype:generate -DgroupId=com.xzit -DartifactId=mvn-web -Dversion=1.0
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
3.IDEA中使用maven
3.1 创建一个maven项目
3.2 设置maven
配置执行指令
配置新建项目的maven设置
3.3 创建web项目
创建项目,从archetype选择
创建目录 java resource
运行方式
-
在pom.xml文件中加入Tomcat7插件 重新加载所有maven项目
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 设置端口 --> <port>9090</port> <!-- 设置路径 --> <path>/</path> </configuration> </plugin> </plugins> </build>
运行
- 另一种方式
3.4依赖的范围和传递
3.4.1 依赖的范围
按作用的阶段,分成三种情况
主程序(src -> main -> java)范围内有效
测试程序(src -> test -> java)范围内有效
是否参与打包
scop | 主程序 | 测试程序 | 打包过程 | 说明 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | 没有指定scope,默认为compile |
test | N | Y | N | 参与测试相关工作,包括测试代码的编译和执行 |
provided | Y | Y | N | 参与编译,测试,运行,不参与打包,在打包阶段,执行了exclude的操作,例如servlet,jsp |
runtime | N | Y | Y | 不参与编译,会参与测试和运行 |
system | 和provided类似,但是依赖不会从maven仓库中查找 |
3.4.2 依赖传递
-
依赖具有传递性
直接依赖
间接依赖
-
依赖冲突问题解决
- 路径优先:当依赖出现重复资源时,路径最短优先
-
声明优先:当依赖资源路径相同时,配置顺序在最前面的优先
-
特殊情况:在pom.xml文件中,同时依赖了一个资源的两个版本,后配置优先
-
可选依赖
aptional 设置为true 引用依赖会无效(默认是false)
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> <scope>runtime</scope> <optional>ture</optional> </dependency>
-
排除依赖
依靠maven helper插件解决
排除配置
pro1 对于pro2项目中的依赖资源进行排除,不需要指定版本
3.5 拆分,聚合和继承
聚合 可以统一管理模块
<!-- 根项目中配置 管理其他 -->
<packaging>pom</packaging>
<modules>
<module>mvn_pro1</module>
<module>mvn_pro2</module>
</modules>
继承 子模块延用父模块pom.xml中的配置以及插件
子模块的pom.xml
<parent>
<artifactId>mvn_parent</artifactId>
<groupId>com.xzit</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父模块的pom.xml文件
<packaging>pom</packaging>
<!--配置子模块-->
<modules>
<module>mvn_module1</module>
<module>mvn_module2</module>
</modules>
<!--配置依赖管理,版本号可以在父工程中统一做配置-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 配置插件管理 版本号可以在父工程中统一处理 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</buil
3.6 属性
- 自定义属性
-
内置属性
${basedir}项目根目录
${version}项目版本
-
pom属性
${project.build.sourceDirectory} 默认 src/main/java
${project.build.testSource.Driectory} 默认 src/main/test
${project.build.directory} 默认 target/
${project.outputDirectory} 默认 target/classes
${project.testOutputDirectory} 默认 target/test-classes
${project.groupId} ${project.artifactId} ${project.version}
-
Setting属性 :读取settings.xml文件值 ${setting.localRepository} //G:/mvn_respository
-
java系统属性 : 通过mvn help:system查看属性 例如 ${user.home} ${java.home}
-
环境变量属性 : 通过mvn help:system查看属性 需要配置前缀 env ${env.JAVACMD}
3.7 配置文件和资源文件
src/main/java 目录下只有.java文件会被编译,放在target/classes下面,其他文件,默认情况下不会被放在target/classes目录下
需要在pom.xml的build元素下做配置
<resources>
<!--配置在resources下面的资源文件,并可以读取pom.xml文件中的属性值-->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<!--包含资源文件的目录-->
<directory>src/main/java</directory>
<!--要参与编译的资源文件-->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<!--是否资源文件在pom.xml文件中做了配置并引用-->
<filtering>false</filtering>
</resource>
</resources>
db.properties
jdbc.username=${jdbc.username}
对应在pom.xml 文件中
4. maven私服 nexus的下载及安装
4.1 nexus私服 安装
下载地址
https://help.sonatype.com/repomanager3/product-information/download
解压后两个文件夹
nexus-3.31.1-01:服务器
sonatype-work:工作空间
执行
进入到nexus -> bin 执行cmd
执行(nexus /run nexus_server(服务器名称) )
见到下面文字,表名服务器启动成功
Started Sonatype Nexus OSS 3.31.1-01
打开浏览器,访问http://localhost:8081/
如果需要修改8081默认端口,到到nexus->etc-> .properties文件
如果要修改虚拟机参数,到nexus->bin->nexus.vmoptions进行修改
4.2 登录处理
点击sign in
输入用户名和密码
用户名:admin
密码:存储在 G:\Java\nexus-3.31.1-01-win64\sonatype-work\nexus3\admin.password
4.3 执行配置步骤
-
第一步
-
第二步
配置和确认新密码(123456)
-
第三步
配置是否可以匿名访问
-
第四步
收集信息,帮助改善nexus
-
第五步
完成
4.4 仓库类型
代理仓库:代理远程仓库,访问全球中央仓库或其他公共仓库,将资源存储在私服上
宿主仓库:公司自主研发的资源或者像oracle驱动这样非开源项目资源,可以分成release或snapshot等
仓库组:仓库组中包含多个仓库,本身不能存资源的,简化配置,避免用户自己去查找每一仓库
4.5 创建仓库
创建一个存放release (发布版)版本的仓库
创建一个存放snapshot版本的仓库
snapshot 快照版
将两个仓库加入到maven_public组
4.6 向私服仓库上传资源
4.6.1 手动长传第三方资源
上传oracle驱动
上传之后
4.7 idea操纵nexus私服
本地仓库需要配置的settings.xml中
-
访问私服的账号和密码
-
在maven下conf ->settings.xml下的servers中配置
<server> <id>maven-public</id> <username>admin</username> <password>123456</password> </server>
-
下载地址 在profiles元素下配置
<profile> <id>nexus</id> <repositories> <repository> <id>maven-public</id> <name>xz-nexus</name> <url>http://localhost:8081/repository/maven-public/</url> <!-- 配置发布版本和快照版本是否可用 --> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <!-- 配置插件 --> <pluginRepositories> <pluginRepository> <id>maven-public</id> <url>http://localhost:8081/repository/maven-public/</url> <!-- 配置发布版本和快照版本是否可用 --> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile>
配置当前当前被激活的Profiles
<activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles>
在工程中配置的
-
长传的地址
在工程的pom.xml 文件中配置
<distributionManagement> <repository> <id>maven-public</id> <url>http://localhost:8081/repository/xz_release/</url> </repository> <snapshotRepository> <id>maven-public</id> <url>http://localhost:8081/repository/xz_snapshot/</url> </snapshotRepository> </distributionManagement>
执行maven生命周期中的 deploy