理想的项目构建
高度自动化,跨平台,可重用的组件,标准化
传统方式管理jar包依赖的问题:
-
jar包冲突
-
jar包依赖
-
jar包体积过大
-
jar包在不同阶段无法个性化配置
使用maven方式管理jar包依赖的好处:
-
解决jar包冲突
-
解决jar包依赖问题
-
jar包不用再每个项目保存,只需要放在仓库即可
-
maven可以指定jar包的依赖范围
注:Maven安装与配置参考[Maven安装与配置](
)
[](
)Maven标准目录结构
若要使用Maven,那么项目的目录结构必须符合Maven的规范,其目录结构如下:
project
src
main 项目主代码和资源
java 项目的Java源代码
resources 项目的资源文件
webapp web项目资源文件(可无)
test 单元测试代码和资源
java 测试的Java源代码
resources 测试的资源文件(可无)
target 打包输出目录(可无)
classes 编译输出目录
test-classes 测试编译输出目录
pom.xml
[](
)Maven的几个核心概念
[](
)POM
POM(Project Object Model)项目对象模型,一个项目所有的配置都放在POM文件中:定义项目的类型、名字、管理依赖关系,定制插件的行为等等。
Maven通过pom.xml文件来管理依赖和管理项目的构建生命周期,而项目构建的生命周期是依靠一个个的插件完成的。
[](
)Maven仓库
Maven管理资源的位置。仓库里面包含依赖(jar包)和插件(plug-in)。Maven仓库分为本地仓库和远程仓库,而远程仓库又包括私服和中央仓库。
Maven仓库
----本地仓库
----远程仓库
--------私服
--------中央仓库
--------其他公共库
[](
)本地仓库
用户自己电脑上的仓库,直接从本地获取。
[](
)远程仓库
[](
)私服
私服是一种特殊的远程仓库,搭建在局域网内的仓库,私服代理广域网的仓库,提供给局域网内的用户使用,可用减少局域网内的用户与外界仓库的传输,每一个jar包只需要拉取一次就可以提供给局域网内所有的用户使用,并且也更加稳定。
注:Maven私服Nexus安装可参考[Maven私服Nexus安装与使用](
)
[](
)中央仓库
Maven官方提供的远程仓库,里面拥有最全的jar包资源,Maven首先从本地仓库中寻找项目所需的jar包,若本地仓库没有,再到Maven的中央仓库下载所需jar包。地址是:http://repo1.maven.org/maven2/。
[](
)坐标
在Maven中,坐标是jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的jar包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
-
groupId:公司或组织域名倒序
-
artifactId:模块名
-
version:版本号
-
packaging:项目的打包方式(pom/jar/war,默认jar)
groupId、artifactId、versioin简称GAV(Maven坐标),是用来唯一标识jar包的。
最新最全的Maven依赖项版本查询网站:
http://mvnrepository.com/
Maven工程的坐标与仓库中路径的关系:
Maven坐标和仓库对应的映射关系:
[groupId][artifactId][version][artifactId]-[version].jar
对应本地仓库目录:
org\springframework\spring-core\4.3.4.RELEASE\spring-core-4.3.4.RELEASE.jar
[](
)依赖传递
如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用的Jar包都下载到本地。
传递性依赖机制能够大大的简化依赖声明,而且大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖,但是当出现冲突了,则需要很清楚传递性依赖是从什么依赖路径引入的。
WebMavenDemo项目依赖JavaMavenService1,JavaMavenService1项目依赖JavaMavenService2
pom.xml文件配置好依赖关系后,必须首先mvn install后,依赖的jar包才能使用。
-
WebMavenDemo的pom.xml文件想能编译通过,JavaMavenService1必须mvn install
-
JavaMavenService的pom.xml文件想能编译通过,JavaMavenService2必须mvn install
为JavaMavenService2中增加了一个spring-core.jar包后,会惊喜的发现依赖的两个项目都自动的增加了这个jar包,这就是依赖的传递性。
注意:非compile范围的依赖是不能传递的。
[](
)依赖冲突
Maven依赖规则和怎么解决依赖冲突问题可以参考[Maven依赖冲突](
)
[](
)依赖范围
依赖范围就是控制依赖在不同阶段的作用。不同的依赖会使用不同的classpath,在Maven中依赖的域有这几个:import、provided、runtime、compile、system、test。默认取值为compile。
[](
)可选依赖和依赖排除
[](
)可选依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.6.RELEASE</version>
<!-- 不可以向下传递依赖 -->
<optional>true</optional>
</dependency>
在导入一个依赖的时候,是否需要把这个依赖向下传递
false:可以向下传递(默认值)
true:不可以向下传递
[](
)排除依赖
如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去掉springboot默认配置的logback依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
[](
)聚合
-
什么是聚合?
将多个项目同时运行就称为聚合。聚合的作用,是为了简化构建项目的过程。一次性构建多个项目!
-
如何实现聚合?
只需在pom中作如下配置即可实现聚合
<modules>
<module>nacos-config-example</module>
<module>nacos-discovery-example</module>
<module>nacos-gateway-example</module>
</modues>
[](
)继承
-
什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
继承的作用,为了简化pom.xml配置,简化groupId,artifactId, version ,还可以锁定子工程依赖版本。
-
如何实现继承?
- 父pom配置:将需要继承的Jar包的坐标放入标签即可。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
</dependencies>
</dependencyManagement>
- 子pom配置:
<parent>
<groupId>父pom所在项目的groupId</groupId>
<artifactId>父pom所在项目的artifactId</artifactId>
<version>父pom所在项目的版本号</version>
</parent>
[](
)生命周期
Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:
**① Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 **Clean生命周期一共包含了三个阶段:
-
pre-clean 执行一些需要在clean之前完成的工作
-
clean 移除所有上一次构建生成的文件
-
post-clean 执行一些需要在clean之后立刻完成的工作
② Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
-
validate
-
generate-sources
-
process-sources
-
generate-resources
-
process-resources 复制并处理资源文件,至目标目录,准备打包
-
compile 编译项目的源代码
-
process-classes
-
generate-test-sources
-
process-test-sources
-
generate-test-resources
-
process-test-resources 复制并处理资源文件,至目标测试目录
-
test-compile 编译测试源代码
-
process-test-classes
-
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
-
prepare-package
-
package 接受编译好的代码,打包成可发布的格式,如 JAR
-
pre-integration-test
-
integration-test
-
post-integration-test
-
verify
-
install 将包安装至本地仓库,以让其它项目依赖。
-
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
总结:不论你要执行生命周期的哪一个阶段,maven都是从这个生命周期的开始执行
插件:每个阶段都有插件(plugin)。插件的职责就是执行它对应的命令。