Maven学习笔记

简介

Maven作用: (1) 依赖管理,(2) 构建项目 (编译测试打包发布)

仓库:本地仓库 > 私服 > 中央仓库 // 仓库的作用是存放各种jar包

下载坐标网址https://repo1.maven.org/maven2/

**查看依赖网址:**https://mvnrepository.com

1 下载安装

1.1 下载

官网:https://maven.apache.org/index.html

官网:www.maven.apache.org/docs/history.html

1.2 右键解压

1.3 配置环境变量

注释:需要JAVA_HOME,与JDK环境变量

1.4 测试(输入mvn 或者 mvn -v)

注释:首次执行mvn命令会在c盘user下新建.m2文件夹

1.5 修改配置

打开conf/settings文件

1.5.1 修改本地仓库目录

从中央服务器或私服下载的jar包会存放在当前目录下

XML 复制代码
<localRepository>D:\.m2\repository</localRepository>

1.5.2 修改镜像

注释:为了提高国内依赖的下载速度

阿里云镜像‌:https://maven.aliyun.com/repository/central

华为云镜像:https://repo.huaweicloud.com/repository/maven/

腾讯云镜像:https://mirrors.cloud.tencent.com/nexus/repository/maven-public/

中科大镜像:https://mirrors.ustc.edu.cn/maven-central/

XML 复制代码
	<mirror>
		<id>aliyunmaven</id>
		<mirrorOf>*</mirrorOf>
		<name>阿里云公共仓库</name>
		<url>https://maven.aliyun.com/repository/central</url>
	</mirror>

1.5.3 修改maven的JDK版本

注释:为了确保编译构建与项目的版本一致

XML 复制代码
	<profile>
		<id>jdk-1.8</id>
		<activation>
			<activeByDefault>true</activeByDefault>
			<jdk>1.8</jdk>
		</activation>
		<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>
			<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
		</properties>
	</profile>

2 创建Maven项目

Maven项目结构

2.1 Maven命令创建项目

2.1.1 命令创建Java项目

(1) 命令

XML 复制代码
mvn archetype:generate -DgroupId=com.myacompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

(2) 执行

2.1.2 命令创建Web项目

(1) 命令

XML 复制代码
mvn archetype:generate -DgroupId=com.myacompany.app -DartifactId=my-web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

(2) 执行

2.2 工具创建Maven项目

2.2.1 Eclipse创建Maven Web项目

File > New > Other

2.2.2 IDEA创建Maven Web项目

FIle > New > Module...

2.2.3 STS创建Maven Web项目

3 maven命令

3.1 生命周期

(1) 编译:mvn compile // 将java编译成target下class文件

(2) 清理:mvn clean // 清除target下class文件

(3) 编译测试类:mvn test-compile // 生成测试类的class文件

(4) 测试:mvn test // 运行test包下的测试类

(5) 打包:mvn package // 将项目打包(jar, war)

注释:jar包可以直接打包,war打包如果出错需要在pom.xml中配置插件

XML 复制代码
<!-- 打war包插件 -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.1</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>

(6) 安装:mvn install // 将工厂发布到本地库(配置文件.m2下)

(7) 发布:mvn deploy //将工程发布到远程库(如Nexus)

3.2 组合命令

(1) 清理-发布:mvn clean install //按顺序执行

(2) 发布-跳过测试:mvn install -DskipTests

(3) 清理-打包-跳过测试:mvn clean package -DskipTests

(4) 安装-多环境id:mvn install -P [pom的profiles环境id]

3.3 其它命令

(1) 查看依赖树:mvn dependency:tree

(2) 分析依赖:mvn dependency:analyze

4 pom文件

根目录:project

Pom版本:modelVersion// XML的版本,无需改动

组织名:groupId// 域名+公司名(com.example)

项目名:artifactId// 项目-模块

版本号:version// 主版本.此版本.修订版 ,快照(SNAPSHOT)稳定(RELEASE)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
    <artifactId>idea_maven</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

打包方式:packaging// jar(默认), war , pom(不打包)

XML 复制代码
    <packaging>war</packaging>

多环境开发:profiles

XML 复制代码
    <profiles>
        <profile>
            <id>env_dep</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.0.0.1:3306/dbname</jdbc.url>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>env_pro</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.0.0.1:3307/dbname</jdbc.url>
            </properties>
        </profile>
        <profile>
            <id>env_test</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.0.0.1:3308/dbname</jdbc.url>
            </properties>
        </profile>
    </profiles>

版本统一:properties

XML 复制代码
<properties>
  <xx.version>1.1.2</xx.version>
  <maven.compiler.source>17</maven.compiler.source><!--配置jdk版本(maven工程用)-->
  <maven.compiler.target>17</maven.compiler.target><!--配置jdk版本(maven工程用)-->
  <project.build.sourceEncoding>UTF-8</..><!--配置构建编码(maven工程用)-->
  <jdbc.url>jdbc:mysql://127.0.0.1:3306/dbname</..><!--maven配置数据库-->
</properties>

依赖管理:dependencies

依赖:dependency

依赖组织名:groupId

依赖项目名:artifactId

依赖版本号:version

依赖范围:socpe// 可选配置,

(1)compile(默认:编译,测试,运行)

(2)provided(编译,测试) // 用于服务器已经提供的jar包,例如servlet

(3)runtime(测试,运行) // 例如jdbc接口不用编译

(4)test(测试)

(5)system(编译,测试) // Maven以外系统提供,不常用

(6)import// 与dependencyManagement配合使用,实现继承

XML 复制代码
<dependencies>
  <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
  </dependency>
  <dependency>
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>${xx.version}</version> <!--对应版本统一版本号-->
  </dependency>

编译相关:build

打包配置:resources// main/resources下文件默认打包到classes下, main/java下文件不打包

XML 复制代码
<build>
  <resources>
    <resourece>
      <directory>src/main/java/</directory> <!--可以打包resources包以外的配置文件-->
      <includes>
        <include>**/*.xml</include> <!--打包指定目录下所有.xml文件-->
      </includes>
    </resource>
    <resource>
      <directory>../项目名/src/main/resrources/</directory>
      <filtering>true</filtering> <!--使目标文件可以解析${}-->
        <!--让jdbc.properties可识别pom的properties属性-->
        <!-- jdbc.properties( jdbc.url=${jdbc.url} )-->
    </resource>
        <!--注释:可以配置一个文件,找到全部项目下的配置-->
        <!-- <directory>${project.basedir}/src/main/resources</directory>-->
  </resources>
</build>

插件:plugins

XML 复制代码
<build>
    <plugins>
      <!-- 解决tomcat7中文乱码问题-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artrfactId>
        <version>2.2</version>
        <configuration>
          <port>8090</port>
          <path>/</path>
          <uriEncoding>UTF-8</uriEncoding>
          <server>Tomcat7</server>
        </configuration>
      </plugin>
      <!-- war打包插件 -->
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-war-plugin</artifactId>
         <version>3.3.1</version>
         <configuration>
            <failOnMissingWebXml>false</failOnMissingWebXml>
         </configuration>
      </plugin>
    </plugins>
</build>

5 模块化

5.1 子模块(服务器端)

pom.xml(<packaging>=jar默认可不写)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <artifactId>maven_dao</artifactId>
    <packaging>jar</packaging>    
    <parent>
        <artifactId>maven_modules</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
</project>

5.2 子模块(Web端)

pom.xml (<packaging>=war)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <artifactId>maven_webapp</artifactId>
    <packaging>war</packaging>
    <parent>
        <artifactId>maven_modules</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
</project>

<relativePath>:// 指定父工程位置,默认从上层目录查找,不在上层则需要指定

XML 复制代码
    <parent>
        <artifactId>maven_modules</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../主工程名/pom.xml</relativePath>
    </parent>

**<groupId>**子工程groupId:继承父工程后,与父工程一致时,可省略不写

**<artifactId>**子工程artifactId:

**<version>**子工程version:继承父工程后,与父工程一致时,可省略不写

XML 复制代码
    <groupId>com.example</groupId>  
    <artifactId>maven_webapp</artifactId>
    <version>1.0-SNAPSHOT</version>

<dependencies>

<dependency>:父工程添加的dependency 子工程可以直接使用,并且一定会进行依赖。

<groupId>:父工程添加的dependencyManagement,子工程需要手动添加依赖。

<artifactId>:父工程添加的dependencyManagement无需指定版本号。

5.3 父工程(pom.xml)

pom.xml (<packaging>=pom) // 当前项目不做编译时指定为 pom

<parent>: springboot项目可以为根项目指定父工程

<dependencyManagement>:定义子模块可以选择性引入的依赖,子工程引入不加版本号

XML 复制代码
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>x</groupId>
      <artifactId>x</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>:定义子模块一定会引入的依赖

XML 复制代码
  <dependencies>
    <dependency>
      <groupId>x</groupId>
      <artifactId>x</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>

<build>:定义子模块可以选择性引入的插件,子模块无需指定版本号

XML 复制代码
    <build>
      <pluginManagemnt>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8085</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
      </pluginManagemnt>
    </build>

<modules>:模块管理,编辑主工程,会将子工程一起编译(与定义顺序无关,先编译底层项目)

XML 复制代码
    <modules>
        <module>maven_pojo</module>
        <module>maven_dao</module>
        <module>maven_service</module>
        <module>maven_controller</module>
        <module>maven_webapp</module>
    </modules>

6 依赖管理

6.1 依赖传递

工程1 > 工程2 > 工程3 // 工程1依赖工程2,工程2依赖工程3

原则: 工程1可以使用工程2的依赖(工程3)

传递优先级:层级浅的优先,同级先定义的依赖优先使用

6.2 依赖范围

dependency的scope属性,〇表示存在于该阶段,✖表示不存在于该阶段

(1)compile(编译〇,测试〇,运行〇)// 默认,不写scope的默认属性

(2)provided(编译〇,测试〇,运行✖) // 用于服务器已经提供的jar包,例如servlet

(3)runtime(编译✖,测试〇,运行〇) // 例如jdbc接口不用编译

(4)test(编译✖,测试〇,运行✖)

(5)system(编译〇,测试〇,运行✖) // Maven以外系统提供,不常用

(6)import// 与dependencyManagement配合使用,实现继承

6.3 依赖范围传递

工程1 > 工程2 > 工程3 // 工程1依赖工程2,工程2依赖工程3

6.3.1 compile(可以传递)

工程1 (工程2,scope=compile),工程3会传递到工程1中

6.3.2 provided(部分传递)

工程1 (工程2,scope=provided),工程2 (工程3,scope=provided),工程3会传递到工程1中

工程1 (工程2,scope=provided),工程2 (工程3,scope=compile),工程3不传递

工程1 (工程2,scope=provided),工程2 (工程3,scope=runtime),工程3不传递

6.3.3 runtime(部分传递)

工程1 (工程2,scope=runtime),工程2 (工程3,scope=runtime),工程3会传递到工程1中

工程1 (工程2,scope=runtime),工程2 (工程3,scope=compile),工程3不传递

工程1 (工程2,scope=runtime),工程2 (工程3,scope=provided),工程3不传递

6.3.4 test(不可传递)

工程1 (工程2,scope=test),工程3不传递

6.3.5 system(不可传递)

工程1 (工程2,scope=system),工程3不传递

6.4 依赖冲突

6.4.1 自动选择

根据依赖传递的优先级(层级浅或同级先定义的优先),自动选择

6.4.2 手动选择

(1) 可选依赖

工程1 > 工程2 > 工程3 (工程1 依赖 工程2, 工程2 依赖 工程3)

optional: true(不对外公开),false(默认:对外公开)

XML 复制代码
<!-- 工程1pom -->
<dependency>
  <groupId>工程2</groupId>
  <artifactId>工程2</artifactId>
</dependency>
XML 复制代码
<!-- 工程2pom -->
<dependency>
  <groupId>工程3</groupId>
  <artifactId>工程3</artifactId>
  <version>...</version>
  <optional>true</optional>
</dependency>

(2) 排除依赖

工程1 > 工程2 > 工程3 (工程1 依赖 工程2, 工程2 依赖 工程3)

exclusions: 指定依赖的工程内 不对其依赖的子工程,不用指定版本号

XML 复制代码
<!-- 工程1pom -->
<dependency>
  <groupId>工程2</groupId>
  <artifactId>工程2</artifactId>
  <version>...</version>
  <exclusions>
    <exclusion>
      <groupId>工程3</groupId>
      <artifactId>工程3</atrifactId>
    </exclusion>
  </exclusions>
</dependency>
XML 复制代码
<!-- 工程2pom -->
<dependency>
  <groupId>工程3</groupId>
  <artifactId>工程3</artifactId>
  <version>...</version>
</dependency>

7 nexus私服

7.1 下载安装

下载网址:https://help.sonatype.com/repomanager3/download

下载Windows版

解压缩

注释:nexus-3.77.1-01(服务器),sonatype-work(工作空间)

执行安装

命令启动

cd nexus的bin目录

启动命令: ./nexus /run

启动成功

7.2 访问

访问地址:http://localhost:8081

注释:端口号可通过 etc/nexus-default.properties的application-port=8081来修改,默认8081

如若访问一直加载,通过控制台 ctrl+c 终止运行后(访问成功)

登录

用户名:admin

密码:在下记安装目录的提示路径下

登录成功

重新设置密码

设置匿名访问(上边:允许匿名访问,下边:禁止匿名访问)

7.3 仓库

maven-central:中央仓库或代理(链接)

maven-public:外部下载jar包的存放位置

maven-releases:内部开发jar包正式版

maven-snapshots:内部开发jar包测试版

nuget-group:ASP.NET相关

nuget-hosted:ASP.NET相关

nuget-org-praxy:ASP.NET相关

注释:初始仓库双击打开都是空的。

7.3.1 修改中央仓库镜像地址

https://maven.aliyun.com/repository/public

7.3.2 修改默认端口

修改nexus私服的etc目录下的nexus-default.properties文件

7.3.3 创建仓库

指定名称

创建仓库

7.3.4 仓库添加到管理列表

7.4 Jar下载与发布

7.4.1 开发人员通过Nexus下载Jar

修改开发人员本地仓库配置文件(可提前备份)

设置本地仓库(<localRepository>D:\.m2\repository-nexus</localRepository>)

配置镜像

XML 复制代码
<mirror>
    <id>nexus-mine</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus mine</name>
    <url>http://192.168.1.100:8081/repository/maven-public/</rl>
</mirror>

配置访问密码(Nexus不允许匿名访问时设置)

XML 复制代码
<server>
    <id>nexus-mine</id>
    <username>admin</username>
    <password>pws</password>
</server>

下载jar包:通过mvn命令(清空,编译等)会自动下载jar包到私服仓库

7.4.2 发布Jar到Nexus

修改工程根pom配置文件(配置上传到私服的路径)

注释:执行命令 mvn deploy 将 jar包或war包发布到私服

XML 复制代码
<snapshotRepository>
    <id>nexus-mine</id>
    <name>Nexus Snapshot</name>
    <url>http://192.168.1.100:8081/repository/maven-snapshots</url>
</snapshotRepository>

7.4.3 引用别人Jar包

修改项目的Pom文件(从指定仓库中下载依赖)

7.5 Nexus操作

7.5.1 添加普通用户

相关推荐
OSwich1 小时前
【 Godot 4 学习笔记】运算符
笔记·学习·godot
Hammer_Hans2 小时前
DFT笔记42
笔记
艾莉丝努力练剑2 小时前
【Linux加餐】mmap文件映射
linux·运维·服务器·c语言·c++·学习
叶子野格2 小时前
《C语言学习:编程例题》8
c语言·开发语言·c++·学习·算法·visual studio
returnthem2 小时前
运维笔记:Shell 脚本入门到实践
运维·笔记
迷你可可小生2 小时前
面经学习(二)
学习·算法
XS0301062 小时前
agent笔记(二)Langchain关键对象
人工智能·笔记·langchain
夜瞬2 小时前
NLP学习笔记05:命名实体识别(NER)入门——从规则方法到 BERT
笔记·学习·自然语言处理
The Chosen One9852 小时前
【实物图讲解】硬盘的工作原理笔记
笔记