标签:star provided ima yun 针对 sources 修改 下载方式 relative
Maven是一种流行的服务于Java开发平台的自动化构建工具,对生产环境下多框架、多模块整合开发有重要作用。
(1)一个项目即为一个工程
问题:未使用Maven前,一个项目就是一个工程。当项目非常大时,用package来划分模块,显得非常臃肿。
解决:使用Maven可以将一个项目拆分成多个工程(模块)。然后多个工程组成一个完整项目,方便团队分工合作开发。
(2)项目中使用的jar包,需要手动导入
问题:同样的jar包会重复出现在不同的项目中。既浪费存储空间,也使项目显得臃肿。
解决:使用Maven可以将jar包放入仓库并进行管理。将jar包放到某个文件夹(仓库)中,当某工程需要使用时,直接“引用“仓库里的jar包,不需要将其复制一份导入工程。
(3)项目所需的jar包,需手动下载
问题:不同官网提供jar包下载方式不同。使用不同方式下载的jar包可能不一定规范。
解决:Maven可以解决,将jar包按照固定规则存放在某一个仓库中,可以直接下载规范的jar包。
(4)一个jar包依赖的其他jar包,需要手动导入项目
问题:所有jar包依赖关系都需要了解清楚,增加学习难度。
解决:使用Maven可以自动将某jar包所依赖的jar包导入。
(1)什么是构建(不是创建)?
以“Java源文件”、“框架配置文件”、“JSP”、“HTML”、“图片”等资源为原材料,“生产”出一个可以运行的项目,这个过程称为构建。分为编译、部署。
(2)编译:
xxx.java源文件 >>> 经过编译 >>> xxx.class字节码文件 >>> JVM执行
(3)部署:
一个B/S项目运行的并不是动态的Web工程源文件本身,而是编译后的Web工程。将Web工程经过编译后,部署到相应位置,启动服务器,才会去调用。
对于文件路径的写法,以编译后的目录结构为准。
(1)清理:将target目录之前编译的字节码(.class)文件删除,为下一次编译做准备。
(2)编译:将Java源程序(.java)编译成新的字节码文件(.class)
(3)测试:自动测试,自动调用Junit程序。
(4)报告:报告程序执行的结果。
(5)打包:动态的Web工程打war包,Java工程打jar包。
(6)安装:将打包的文件复制到maven仓库的指定位置。
(7)部署:将war包复制到servlet容器指定的目录下,使其可以运行。
注:使用maven,可以自动化构建,省去了编译、打包、部署等操作。
历史版本下载:https://archive.apache.org/dist/maven/maven-3/
Apache官网下载:http://maven.apache.org/download.cgi/
因为Maven是Java编写的,需要JDK才能运行。
命令行输入:java -version 查看系统环境变量配置的JDK版本
比如解压在 F:\maven 目录下
修改系统环境变量(类似JDK配置环境变量):
添加MAVEN_HOME或者M2_HOME环境变量的键,值为:F:\maven\apache-maven-3.6.1
PATH环境变量最后面加上:%MAVEN_HOME%\bin
输入mvn -version 或者 mvn -v,如果出现maven版本信息,则表示配置成功。
(1)约定的工程(模块)目录结构
(2)POM(工程对象模型)
(3)GAV坐标
(4)依赖(重点)
(5)仓库
(6)生命周期、插件、目标
(7)继承
(8)聚合
其中:
src目录:表示的是 源码。
target目录:表示的是 编译、打包后的文件。
pom.xml目录:表示的是 maven核心配置文件。
main目录:表示的是 存放主程序.
test目录:表示的是 存放测试程序.
class目录:表示的是 编译的字节码文件.
java目录:表示的是 存放java源文件.
resources目录:表示的是 存放框架或者其他工具的配置文件。
为什么要遵循约定的目录结构? >>> 按照约定不用额外进行配置降低学习难度
Maven负责自动化构建项目,以编译为例,maven想要自动进行编译,则必须知道java源文件的位置在哪,
按照约定(默认)的目录结构去找java源程序,这为maven的构建提供了便利。
注:
约定(默认配置) > (手动)配置 > 编码
既能用约定解决就不用配置实现;能用配置解决就不用编码实现。
执行与构建过程相关的maven命令(如编译、测试、打包等)时,必须进入pom.xml所在的目录(既工程顶级目录),再执行命令。
注:若在不含pom.xml文件的目录下执行下方构建工程命令,会报错。
常用命令:
mvn clean; 清理字节码文件
mvn compile; 编译主程序文件
mvn test-compile; 编译测试程序
mvn test; 执行测试junit
mvn package; 将项目打包成jar包或者war包
mvn install; 安装maven工程到本地仓库
mvn site; 生成站点
(1)maven的核心程序仅定义了抽象的生命周期,具体的工作必须由不同的插件完成,但是这些插件并没有包含在maven的核心程序中。
(2)当执行某个maven命令需要使用某些插件时,首先会从本地仓库中查找。如果本地仓库中找不到那个指定的插件,则会自动联网去maven的中央仓库下载。若此时无法连接外网,则会执行失败。
(1)maven 中央仓库 地址为 :https://search.maven.org/
(2)进入地址后,搜索想要找的jar包。比如:mybatis。
(3)点击,进入MyBatis,并点击某个版本并下载jar包
(1)找到maven解压包的下的 conf\settings.xml 文件。
比如:F:\maven\apache-maven-3.3.9\conf\settings.xml
(2)配置指定本地仓库目录
在 settings.xml 文件中找到
例如:<localRepository>F:\maven\repository</localRepository>
(3)配置阿里云镜像
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
(1)POM : Project Object Model 项目对象模型。
(2)pom.xml:是maven工程核心配置文件,与构建过程相关的所有设置均在这个文件中进行配置。
数学中:平面上通过X,Y两个向量,唯一定位平面中一点。
空间上通过X,Y,Z三个向量,唯一定位空间中一点。
(2)maven中:
使用GAV三个值唯一定位一个maven工程。
<!-- groupId(组织、集团、公司标识符),一般是公司域名(一级域名.二级域名.三级域名.四级域名.项目名) -->
<groupId>mysql</groupId>
<!-- artifactId(工件标识符),一般为模块名 -->
<artifactId>mysql-connector-java</artifactId>
<!-- version,版本标识符 -->
<version>8.0.22</version>
(3)maven的GAV与目录的对应关系:
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
会对应到本地仓库中:
junit\junit\4.12\junit-4.12.jar
即 groupId\artifactId\version\artifactId-version.jar
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.8.RELEASE</version>
会对应到本地仓库中:
org\springframework\boot\spring-boot-starter-web\2.3.8.RELEASE\spring-boot-starter-web-2.3.8.RELEASE.jar
(1)本地仓库:Maven配置文件中指向的仓库目录,为当前电脑的所有maven工程服务。
(2)远程仓库:
公司私服:搭建在公司局域网中,为局域网范围内的所有maven工程服务。
中央仓库:搭建在Internet上,为全世界范围内的maven工程服务。
中央仓库镜像:为了分担中央仓库的压力,给访问分流,提升访问效率,比如阿里镜像、华为镜像。
(3)仓库保存的东西是什么?
保存maven执行构建命令时所需要的插件。
保存三方库(一方库指JDK,二方库指开发人员)框架或工具的jar包。
保存自己开发的maven工程。
即仓库保存的就是各种jar包。
(1)Maven解析依赖信息(即解析<dependency>
标签的内容)时,会首先从本地仓库进行查找被依赖的jar包,没有则从远程仓库中找到被依赖的jar包,找到了目标jar包则会下载一份二到本地仓库中。
针对自己开发的Maven工程,进入含有pom.xml所在的目录,执行 mvn install命令后,可以将自己开发的Maven工程安装到本地仓库中 。
(2)依赖的作用域(<scope>
标签的内容):
作用域 |
对主程序是否有效 | 对测试程序有效 | 是否参与打包(部署) | 典型例子 |
---|---|---|---|---|
compile | 有效 | 有效 | 参与 | spring-core |
test | 无效 | 有效 | 不参与 | junit |
provided | 有效 | 有效 | 不参与 | servlet-api.jar |
原因分析
compile
作用域的依赖:默认的依赖作用范围,开发时需要,部署时也需要(运行时servlet容器不会提供),一般的就是这样。test
作用域的依赖:主程序(main)是无法依赖test范围的jar的,开发时就不可以使用(那些jar主程序也是用不到的,主要是测试框架),只有测试程序可以依赖。要知道,测试程序常规是不参与打包的,test范围的依赖也不参与打包,只是在开发阶段会用到,或者maven编译(compile)时会执行测试程序。provided
作用域的依赖:开发时,由于没有运行时环境,有些jar我们需要暂时依赖(不依赖有些方法就会找不到,用不了),但是项目打包部署运行时,由于运行时环境(servlet容器,比如:tomcat)会提供一些jar包,所以开发时那些暂时依赖的jar包就不能参与打包了,否则会发生冲突导致报错。(3)依赖的传递性:当一个模块工程A在pom.xml中配置了相关依赖信息,则其他模块工程B使用这个模块工程A时,不需要再额外的配置依赖的信息了,其会从A中传递到B中。
注:只有compile与runtime范围的依赖才能进行传递。test、provided、system范围的依赖需要在每个工程中手动配置。
(4)依赖的删除(使用<exclusion>
标签)
在pom.xml文件所在的项目工程(模块)中,删除不希望出现的jar包。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-jcl</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
(6)传递依赖的原则:
作用:解决多个模块工程间的jar包冲突问题。
原则:当jar包冲突时
路径最短者优先原则,即传递依赖发生时,优先选择距离(指引用jar包的深度更浅的)该工程最近的jar包。
路径相同时,先声明(上下位置关系在上面的)的先。即
注:非传递依赖时(即直接依赖),以最后的
(7)统一管理jar包的版本号
使用
在
作用:可以使引用这个变量的所有jar包的版本快速修改
【未修改前:】
<properties>
<jar.version>5.1.7.RELEASE</jar.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${jar.version}</version>
</dependency>
</dependencies>
(1)生命周期指的是各个构建环节的执行流程。
(2)maven的核心程序中定义了抽象的生命周期,生命周期的各阶段的具体任务由不同的插件来完成。
(3)为了更好的实现自动化构建,maven的核心程序对于生命周期的每个阶段,都从最开始clean执行,到该生命周期阶段 结束。比如执行 mvn compile 命令时,会从最开始clean执行,直到compile结束。
(4)插件和插件目标:
生命周期的各阶段仅定义了要执行什么任务。
各阶段与不同的插件目标(插件目标指的是调用插件的命令)相对应。
相似的目标由特定的插件来解决。
(1)为什么使用继承?
对于test,provided(非compile范围)作用域范围的依赖,由于不能进行依赖传递,所以需要在每个模块工程中单独定义,可能造成各个模块工程间的jar版本不一致。
所以需要使用一个父工程,并定义好管理这些依赖的信息,令每个模块继承父工程,即可获得非compile范围的依赖信息。对依赖版本修改时,只需修改父工程即可。
注意:每个子工程中相关的非compile范围的依赖仍需写,只是不需要再写版本号了。由父工程统一管理版本号。
注意:使用继承后,在执行maven安装工程的命令时(maven install),必须先安装父工程,再安装子工程。若直接安装子工程,会由于没有找不到依赖的版本号而报错。
(2)继承的操作步骤
第一步:创建一个父工程,并添加相关的非compile范围的依赖。
注意:由于父工程一般只起到聚合子工程的作用,并无java代码,所以父工程创建时的打包方式需要选择 <packaging>pom</packaging>
。
POM是最简单的打包类型。不像一个JAR,SAR,或EAR,它生成的构件只是它本身。打包类型为POM的项目的默认目标
生命周期阶段 | 目标 |
---|---|
package | site:attach-descriptor |
install | install:install |
deploy | deploy:deploy |
项目的打包类型:pom、jar、war
packing 默认是jar类型,如果不做配置,maven会将该项目打成jar包。
pom ---------> 父类型都为pom类型
jar ---------> 内部调用或者是作服务使用
war ---------> 需要部署的项目
【父工程pom.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.jia</groupId>
<artifactId>maventest</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>maven_A</module>
</modules>
</project>
第二步:在子工程中声明父工程。去除子工程中提示重复依赖的信息(可选操作)。
【子工程的pom.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">
<parent>
<artifactId>maventest</artifactId>
<groupId>com.jia</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven_A</artifactId>
</project>
第三步:在父工程<dependencyManagement>
标签中统一管理依赖信息
<?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.jia</groupId>
<artifactId>maventest</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>maven_A</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
第四步:在子工程中声明相应的依赖信息(注意:版本号无需写,写了的话,继承没意义了,相当于重新配置的依赖信息)
<?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">
<parent>
<artifactId>maventest</artifactId>
<groupId>com.jia</groupId>
<version>1.0-SNAPSHOT</version>
<!-- 相对当前pom文件的位置找到父工程的pom路径 -->
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven_A</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
此时即可看到子工程中出现了父工程所配置的依赖信息。
当父工程修改配置信息时,所有的子工程的配置信息将会一起改变。
(1)作用:未使用聚合前,对每个工程(模块),需逐个安装,使用聚合后,可一键安装,只需安装父工程即可。
(2)步骤:
第一步:在父工程中配置聚合。
【pom.xml】
<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.test.maven</groupId>
<artifactId>mavenDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 配置聚合 -->
<modules>
<!-- 根据当前pom.xml的位置,配置子工程所在的路径,maven会自动管理install顺序 -->
<module>../demo2</module>
<module>../demo3</module>
</modules>
<!-- 统一管理依赖配置信息 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
第二步:在父工程中执行mvn install即可。
maven资源导出发生问题pom.xml相关配置:https://www.cnblogs.com/pixy/p/4798089.html
设置maven配置文件settings.xml:https://blog.csdn.net/R812656252/article/details/86574441
标签:star provided ima yun 针对 sources 修改 下载方式 relative
原文地址:https://www.cnblogs.com/hhddd-1024/p/14725168.html