Maven导图
2021-08-28 09:58:05 0 举报
AI智能生成
Maven思维导图
作者其他创作
大纲/内容
3. pom文件内容介绍
自己的坐标信息和父项目信息parent
版本管理
SNAPSHOT(快照管理)
在项目构建中,为了方便团队合作,解决模块间相互依赖和实时更新的问题,发布的临时版本就是快照版
快照版随着开发,会大量发布
RELEASE(发布版本)
项目开发进入里程碑之后,向团队外部发布的较为稳定的版本,这种版本所对顶的额构建文件是稳定的
即便进行功能的后续开发,也不会改变当前发布的内容,这就是发布版本
区别
快照版本是不稳定的,可能不是经过充分测试的,发布版本是稳定的
快照版本大部分是给公司内部使用或者新版本体验的,发布版是真正上线的版本
工程版本号规定
<主版本>.<次版本>.<增量版本>.<里程碑版本>
主版本:标识项目重大的架构变更,比如Spring4到Spring5的变更
次版本号:便是有较大的功能新增和变化,或者全面系统的修复漏洞
增量版本号:标识有重大的漏洞修复
里程碑版本:标识一个版本的里程碑,往往表示不是非常稳定的,还需要很多测试
例如:5.1.9.RELEASE
注意:并不是每个版本号都是这四部分,主版本号和次版本号都会声明,但是增量版本号和里程碑版本号就不一定了
properties
规定一些Maven项目中的公用的一些配置
maven内部已经定义好了很多的环境配置,可以直接访问
profiles
多版本控制
多个环境下,会有多中配置,那个环境的配置生效。
这个可以使用profiles中的profiles定义多个版本的配置文件
哪一个版本生效,是由activation标签决定的
dependencymanagent
依赖版本控制,用来控制多个依赖的版本号控制
之后在dependency中声明的依赖可以不用指定具体的版本号
dependencies
依赖注入,通过dependency注入多个依赖
distributionManagement
指定上传的私服地址
通过内部标签repository配置正式版上传地址
通过内部标签snapshotRepository配置快照版本上传地址
repositories和pluginRepositories
配置下载的仓库地址
repositories配置正常依赖的下载地址
pluginReposities配置插件依赖的下载地址
build构建
resources资源加载配置
在Idea项目中,默认只有src/resource下的静态文件才会被打包到classpath下,其他目录的静态文件不会被打包
如果需要打包,可以配置resources的静态资源打包规则,配置打包的目录,包含的或者排除的文件
plugins插件配置
Maven的插件有很多,包含Maven的命令插件,和很多的打包,部署,编译,启动插件
常用插件
Maven编译插件
<build>
<plugins>
<!-- maven 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</build>
<plugins>
<!-- maven 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</build>
源码打包
<build>
<plugins>
<!-- 源码打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<!-- 进行package命令时就可以将源码同时进行打包 -->
<!-- 所以我们需要绑定source插件到我们default生命周期的package阶段 -->
<executions>
<execution>
<!-- 定义一个阶段,这个阶段是package -->
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<plugins>
<!-- 源码打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<!-- 进行package命令时就可以将源码同时进行打包 -->
<!-- 所以我们需要绑定source插件到我们default生命周期的package阶段 -->
<executions>
<execution>
<!-- 定义一个阶段,这个阶段是package -->
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
生成jar包插件
<properties>
<!-- 管理jdk,编译jdk版本 -->
<java.version>11</java.version>
<!-- 启动类目录 -->
<main-class>com.study.maven.newbee.NewbeeApplication</main-class>
<!-- lib目录前缀 -->
<classpathPrefix>app_lib/</classpathPrefix>
<!-- 单独打包所有的依赖,放到指定目录 -->
<outputDirectory>${project.basedir}/target/app_lib</outputDirectory>
</properties>
<build>
<plugins>
<!-- maven依赖打包 jar包单独打出来 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 项目编译目录target -->
<outputDirectory>${outputDirectory}</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<!-- 生成jar包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- lib目录前缀 -->
<classpathPrefix>${classpathPrefix}</classpathPrefix>
<!-- 启动类全限定类名 -->
<mainClass>${main-class}</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<!-- 把这些配置文件独立出去,静态文件,可以随时更改。如果是部署,可以排除。如果是打包到私服,不要排除,根据具体场景来定 -->
<excludes>
<exclude>public/**</exclude>
<exclude>static/**</exclude>
<exclude>*.xml</exclude>
<exclude>*.yml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<!-- 管理jdk,编译jdk版本 -->
<java.version>11</java.version>
<!-- 启动类目录 -->
<main-class>com.study.maven.newbee.NewbeeApplication</main-class>
<!-- lib目录前缀 -->
<classpathPrefix>app_lib/</classpathPrefix>
<!-- 单独打包所有的依赖,放到指定目录 -->
<outputDirectory>${project.basedir}/target/app_lib</outputDirectory>
</properties>
<build>
<plugins>
<!-- maven依赖打包 jar包单独打出来 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 项目编译目录target -->
<outputDirectory>${outputDirectory}</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<!-- 生成jar包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- lib目录前缀 -->
<classpathPrefix>${classpathPrefix}</classpathPrefix>
<!-- 启动类全限定类名 -->
<mainClass>${main-class}</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<!-- 把这些配置文件独立出去,静态文件,可以随时更改。如果是部署,可以排除。如果是打包到私服,不要排除,根据具体场景来定 -->
<excludes>
<exclude>public/**</exclude>
<exclude>static/**</exclude>
<exclude>*.xml</exclude>
<exclude>*.yml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
生成war包插件
<build>
<plugins>
<!-- 生成war包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<warSourceDirectory>webapp</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
<plugins>
<!-- 生成war包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<warSourceDirectory>webapp</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
tomcat插件
<build>
<plugins>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
</build>
<plugins>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
</build>
springboot启动插件
<properties>
<spring-boot.version>2.5.3</spring-boot.version>
</properties>
<build>
<plugins>
<!-- springboot启动插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
<spring-boot.version>2.5.3</spring-boot.version>
</properties>
<build>
<plugins>
<!-- springboot启动插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
Maven跳过测试插件
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
4. Maven常用命令
idea中的声明周期描述
clear
清除target目录
validate
校验工程是否正确,所需信息是否完整
compile
编译,将项目编译到target目录
test
测试,执行所有的测试案例
package
打包,将项目打包为jar包或者war包,放到target目录
verify
检查,检查package是否有效,符合标准
install
将package打包的jar包安装到本地仓库
deploy
将安装的本地仓库的jar包部署到私服
5. Maven私服的安装和使用
介绍
Maven私服是本地仓库和中央仓库的桥梁
可以拉取中央仓库的内容,并且发布自己的资源到私服,共同管理
私服Docker安装
一般私服使用Nexus服务器管理
docker安装
docker pull sonatype/nexus3:3.33.1
docker run -d --privileged=true -p 8081:8081 --name nexus --restart=always sonatype/nexus3:3.33.1
docker run -d --privileged=true -p 8081:8081 --name nexus --restart=always sonatype/nexus3:3.33.1
可以配置路径映射:-v /docker/nexus/nexus-data/:/nexus-data/
可以配置jvm内存大小:-e INSTALL4J_ADD_VM_PARAMS="-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize=1024m -Djava.util.prefs.userRoot=/some-other-dir"
登录,修改密码
查看原密码
docker exec -it nexus /bin/bash
bash-4.4$ cat /opt/sonatype/sonatype-work/nexus3/admin.password
bash-4.4$ cat /opt/sonatype/sonatype-work/nexus3/admin.password
私服仓库常用类型
hosted
本地仓库,通常用来部署自己的jar包到此类型仓库
分为RELEASE版本和SNAPSHOT类型
proxy
代理仓库,通常用来代理中央,缓存中央仓库中的jar包
group
仓库组,整合多个hosted和proxy类型的仓库,实现同一暴露地址,实现私服有的从私服下载,私服没有的从中央仓库下载
私服中自带的仓库
maven-ventral
Maven中央仓库,默认是官方网站https://repo1.maven.org/maven2/可以修改为阿里云的国内镜像
maven-release
私服发型版本jar
maven-snapshots
私服快照版本jar
maven-public
仓库分组,吧上面三个仓库组合在一起对外提供服务
修改中央仓库的地址
https://maven.aliyun.com/repository/public
创建私服仓库
可以自己创建一套自己的仓库
MyReleases
MyReleases,类型为maven2(hosted),release版本
MySnapshots
MySnapshots,类型为maven2(hosted),snapshot版本
MyProxy
MyProxy,类型为maven2(proxy),代理阿里云
MyGroup
MyGroup,类型为maven2(group),整合上面的三个参控股
Maven全局私服配置settings
在server中配置私服密码
<servers>
<server>
<id>MyMaven</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<server>
<id>MyMaven</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
在mirrors中配置下载的私服仓库地址,为私服仓库组地址
<mirrors>
<mirror>
<id>MyMaven</id>
<mirrorOf>*</mirrorOf>
<name>MyMaven</name>
<url>http://192.168.10.31:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<mirror>
<id>MyMaven</id>
<mirrorOf>*</mirrorOf>
<name>MyMaven</name>
<url>http://192.168.10.31:8081/repository/maven-public/</url>
</mirror>
</mirrors>
Idea上传下载私服的jar包
上传jar包到私服
通过distributionManagement设置上传的私服地址
<distributionManagement>
<!-- 指定私服地址,发布的仓库地址,多个仓库根据仓库类型,自动上传到指定类型的仓库 -->
<repository>
<id>MyMaven</id>
<name>MyMaven</name>
<url>http://192.168.10.31:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>MyMaven</id>
<name>MyMaven</name>
<url>http://192.168.10.31:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<!-- 指定私服地址,发布的仓库地址,多个仓库根据仓库类型,自动上传到指定类型的仓库 -->
<repository>
<id>MyMaven</id>
<name>MyMaven</name>
<url>http://192.168.10.31:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>MyMaven</id>
<name>MyMaven</name>
<url>http://192.168.10.31:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
mvn deploy
下载jar包从私服中
通过repositories和pluginrepositories配置下载的私服地址,如果全局配置过了,可以不用再配置
<!-- 配置远程仓库列表 -->
<repositories>
<!-- 自定义的私服 -->
<repository>
<id>MyRelease</id>
<name>MyRelease</name>
<url>http://192.168.10.31:8081/repository/maven-public/</url>
</repository>
</repositories>
<!-- 配置插件远程仓库列表 -->
<pluginRepositories>
<!-- 自定义的私服 -->
<pluginRepository>
<id>MyRelease</id>
<name>MyRelease</name>
<url>http://192.168.10.31:8081/repository/maven-public/</url>
</pluginRepository>
</pluginRepositories>
<repositories>
<!-- 自定义的私服 -->
<repository>
<id>MyRelease</id>
<name>MyRelease</name>
<url>http://192.168.10.31:8081/repository/maven-public/</url>
</repository>
</repositories>
<!-- 配置插件远程仓库列表 -->
<pluginRepositories>
<!-- 自定义的私服 -->
<pluginRepository>
<id>MyRelease</id>
<name>MyRelease</name>
<url>http://192.168.10.31:8081/repository/maven-public/</url>
</pluginRepository>
</pluginRepositories>
正常添加依赖,更新依赖即可
1. 介绍
什么是Maven
Maven是使用对象模型(POM)的概念,可以通过一小段信息来管理项目的构建、报告和文档的软件项目管理工具
在Maven中,每个项目都是一个对象,对象之间的关系,依赖、继承、聚合。Maven也实现了这些关系。使用Maven项目可以更加方便的管理jar包,项目拆分管理的效果
Maven的作用
项目构建
提供标准的,跨平台的自动化构建项目的方式
依赖管理
方便快捷的而管理项目中依赖的jar,避免资源见得班恩冲突问题
统一开发结构
使用统一的开发结构,可以实现跨编辑器的代码开发
Maven仓库类型
本地仓库
安装到本地的仓库
远程仓库
私服
公司内部搭建的中转站
中央仓库
公网上的开源仓库
本地Maven安装
下载地址
https://maven.apache.org/download.cgi
目录结构
bin
maven命令地址
boot
存放一个jar包(plexus-classworlds),用于加载自己的类库
conf
配置文件地址settings
lib
第三方依赖
Maven初始配置
配置本地仓库存放位置
在localRepository中配置本地仓库位置
配置国内仓库地址
在mirrors中的mirror标签中配置国内仓库镜像,比如阿里云
配置全局jdk版本控制
在profiles配置jdk版本控制,通过activation的activebydefault配置是否默认激活
2. Maven项目的管理
Maven工程类型
POM
逻辑工程,一般用作父工程或者聚合工程中,做jar包版本统一控制
Jar
打包为jar包,使用java -jar运行
War
打包为war工程,发布到服务器上运行,比如tomcat
Maven项目结构
src/main/java
src/main/resource
src/test/java
src/test/resoruce
pom.xml
src/main/resource
src/test/java
src/test/resoruce
pom.xml
Maven工程关系
依赖
介绍
其实就是导jar包,把一个打为jar包的工程引入到本项目中中
导入jar包
在pom.xml中的dependencies标签中配置项目中需要导入的所有jar包
通过dependenciesManage中配置多个jar包的版本控制
依赖的传递
也就是如果依赖一个工程,那么该工程导入的jar包会自动依赖过来,
直接依赖
在本项目的pom.xml中生命的jar包
间接依赖
依赖项目中导入的jar包
依赖传递
也就是如果依赖一个工程,那么该工程导入的jar包会自动依赖过来,
依赖的两个原则
就是解决jar包冲突问题的解决方案
最短路径优先原则
对于间接依赖来说,jar包可达路径短的优先使用,也就是先找到的先用
最先声明原则
如果jar包的可达路径一致(在满足第一原则的基础上),还是冲突,那么就使用第二原则,最先声明原则,谁在pom.xml中先出现,谁先使用
排除依赖
说明
上面的两个原则是自动排除冲突依赖的,也可以手动排除间接依赖,留下唯一一个版本,或者自己重新声明版本
使用
在dependency标签中的exclusions中定义排除的依赖,只需要groupId和artifactId即可,不需要版本号
依赖的范围
compile
默认范围,编译、测试、运行时有效
provided
编译、测试有效,运行时无效。
典型代表,servlet
runtime
只有运行时有效
system
作用范围和provided一致,但是不是从maven仓库去获取jar包的,是从项目路径下加载jar包的,通过systemPath标注jar包所在的本地地址
test
仅测试时有效
import
只适用于pom文件中的dependencyManagent中,进行依赖版本限制
继承
本质上就是POM的继承
父项目只能是POM类型的
继承父项目POM中定义的所有声明
可以在父项目中统一管理jar包版本和公共资源
在子项目中使用parent标签管理父项目,父项目不知道有几个子项目
聚合
聚合的前提是继承,拥有继承的所有特性
聚合就是一组项目,通过聚合放到一个父工程下,统一管理
子项目通过parent管理父工程,父工程中也可以通过modules管理所有的子工程
子项目可以是任意类型,多个子项目可以单独运行,部署
0 条评论
下一页