Maven简介,Java进阶路线图

理想的项目构建

高度自动化,跨平台,可重用的组件,标准化

传统方式管理jar包依赖的问题:

  1. jar包冲突

  2. jar包依赖

  3. jar包体积过大

  4. jar包在不同阶段无法个性化配置

使用maven方式管理jar包依赖的好处:

  1. 解决jar包冲突

  2. 解决jar包依赖问题

  3. jar包不用再每个项目保存,只需要放在仓库即可

  4. 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仓库

[](

)坐标

在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> 

[](

)聚合

  1. 什么是聚合?

    将多个项目同时运行就称为聚合。聚合的作用,是为了简化构建项目的过程。一次性构建多个项目!

  2. 如何实现聚合?

    只需在pom中作如下配置即可实现聚合


<modules>

	<module>nacos-config-example</module>

	<module>nacos-discovery-example</module>

	<module>nacos-gateway-example</module>

</modues> 

[](

)继承

  1. 什么是继承?

    在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。

    继承的作用,为了简化pom.xml配置,简化groupId,artifactId, version ,还可以锁定子工程依赖版本。

  2. 如何实现继承?

  • 父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)。插件的职责就是执行它对应的命令。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值