maven的配置及使用

一、maven

1 简介

项目管理工具

项目对象模型project object model(pom)

一个项目:清理,编译,测试,打包,发布,部署

1.1.1 java构建工具的发展史

make: 编写makefile

Ant: Apache

maven:使用量较高

gradle:安卓端使用较多

bazel:

1.1.2 maven能做什么

  1. 管理jar包
  2. 构建项目:自动完成 (清理,编译,测试,打包,发布,部署)
  3. 项目的拆分与聚合

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(默认)YYY没有指定scope,默认为compile
testNYN参与测试相关工作,包括测试代码的编译和执行
providedYYN参与编译,测试,运行,不参与打包,在打包阶段,执行了exclude的操作,例如servlet,jsp
runtimeNYY不参与编译,会参与测试和运行
system和provided类似,但是依赖不会从maven仓库中查找
3.4.2 依赖传递
  1. 依赖具有传递性

    直接依赖

    间接依赖

  2. 依赖冲突问题解决

    • 路径优先:当依赖出现重复资源时,路径最短优先

请添加图片描述

  • 声明优先:当依赖资源路径相同时,配置顺序在最前面的优先

    请添加图片描述

  • 特殊情况:在pom.xml文件中,同时依赖了一个资源的两个版本,后配置优先

  1. 可选依赖

    aptional 设置为true 引用依赖会无效(默认是false)

     		<dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.32</version>
                <scope>runtime</scope>
                <optional>ture</optional>
            </dependency>
    
  2. 排除依赖

    依靠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 执行配置步骤

  1. 第一步

    请添加图片描述

  2. 第二步

    配置和确认新密码(123456)

    请添加图片描述

  3. 第三步

    配置是否可以匿名访问

    请添加图片描述

  4. 第四步

    收集信息,帮助改善nexus

    请添加图片描述

  5. 第五步

    完成

请添加图片描述

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

请添加图片描述