首页 / 资讯中心 / 文章详情

Maven 进阶学习笔记

Maven 进阶学习笔记 ★ FEATURED ARTICLE
3.1 pom.xml 文件pom 全称Project Object Model项目对象模型是 Maven 项目的核心文件类比 Make 的 MakeFile、Ant 的 build.xml。 pom.xml 定义项目基础信息描述项目如何构建、声明项目依赖、插件配置等。Maven 所有操作都基于 pom.xml。3.2 坐标3.2.1 坐标的概念Maven 坐标是构件项目 /jar 包的唯一标识。 Maven 坐标元素包含groupId、artifactId、version、packaging、classifier。 其中groupId、artifactId、version 是必须定义packaging 可选默认值为jar。3.2.2 坐标的意义Maven 世界里有海量构件需要一套统一标识规则用来唯一标记构件。 有了统一坐标Maven 就可以根据坐标查找构件交给机器自动下载、管理。3.2.3 坐标各元素含义groupId组织标识一般为公司网址反向 项目名例如com.testartifactId项目名称 / 模块名作为项目唯一模块标识例如Helloversion版本号格式示例0.0.1-SNAPSHOTSNAPSHOT快照版本内测版本开发阶段使用ALPHA内部测试版BETA公测版本RELEASE稳定版本GA正式发布packaging打包方式可选值pom、jar、maven-plugin、ejb、war默认jarclassifier用来辅助定义构件输出的附属构件例如源码包、javadoc 包3.2.4 自己项目的坐标也就是我们 Hello 项目 pom.xml 中定义的坐标示例groupIdcom.test/groupId artifactIdHello/artifactId version1.0/version这个坐标就是 Hello 项目的唯一身份标识HelloFriend 就是通过这三组坐标引用 Hello。3.2.5 第三方项目坐标第三方 jar 包如 junit、log4j同样具备坐标。 我们在项目 pom.xml 中通过坐标引入第三方构件。 查找第三方坐标方式访问 Maven 中央仓库网站 https://mvnrepository.com/ 搜索包名直接复制对应的 dependency 配置。3.3 依赖3.3.1 依赖的意义编写 Java 项目时我们常常需要外部类库。例如单元测试需要 junit数据库操作需要驱动包。 大型项目会依赖大量外部 jar不同模块还会依赖不同版本的 jar。手动下载、管理 jar 包、解决版本冲突是非常麻烦的工作。Maven 可以自动下载依赖统一存放到本地仓库。我们只需要在 pom.xml 的dependencies标签内声明依赖关系即可。3.3.2 依赖的使用在dependencies标签内添加dependency引入依赖包。dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency属性说明前三组坐标定位依赖包本地仓库找不到时自动去远程仓库下载scope依赖范围控制该依赖在什么阶段被加入 classpath3.3.3 第三方依赖的查找方法访问 Maven 中央仓库https://mvnrepository.com/搜索需要的 jar 包名称选择需要的版本复制 Maven 的 dependency 代码粘贴到项目 pom.xml 的 dependencies 中IDEA 刷新 Maven自动下载3.4 依赖范围Maven 项目在开发工程中有三套 classpath主代码main目录下编译时生效的依赖测试代码test目录下编译测试代码时的依赖运行时main 代码运行时的依赖依赖范围通过scope标签配置一共有 6 种 scopecompile、provided、runtime、test、system、import。scope主代码 classpath测试代码 classpath打包后运行 classpath示例compileYYYlog4jtestNYNjunitprovidedYYNservlet-apiruntimeNYYJDBC 驱动compile默认编译依赖范围。默认 scope编译、测试、运行三套 classpath 全部生效。可以传递依赖。test测试依赖范围。仅测试代码可用主代码编译、运行都无法使用。不会传递依赖。典型例子 junit。provided已提供依赖范围。编译、测试有效打包不会打进 jar运行环境由外部容器提供。 例servlet-apitomcat 容器自带项目打包不需要包含。runtime运行依赖范围。编译主代码无效测试、运行阶段生效。典型例子 JDBC 驱动。3.5 依赖传递和可选依赖3.5.1 依赖传递应用场景第一直接依赖HelloFriend 项目依赖 Hello 项目第二直接依赖MakeFriend 项目依赖 HelloFriend 项目传递依赖规则当 A 依赖 BB 依赖 C若 B 对 C 的 scope 为 compile那么 A 自动获得 C 的依赖这就是依赖传递。3.5.2 依赖范围对传递依赖的影响传递依赖会受到 scope 影响。 只有 compile 范围的依赖才会向下传递test、provided 不会向下传递。第一层依赖 \ 第二层传递依赖compiletestprovidedruntimecompilecompiletestprovidedruntimetest---testprovidedprovided-providedprovidedruntimeruntime--runtime3.5.3 依赖阻断我们可以阻断传递依赖。 案例HelloFriend 依赖 Hello但是不想继承 Hello 带的传递依赖。 在 HelloFriend 的 pom.xml 中在 Hello 的 dependency 内部配置 exclusions排除指定传递依赖。3.5.4 可选依赖如果想要在依赖中明确排除某一个依赖可以使用exclusion属性阻断传递依赖。dependency groupIdcom.test/groupId artifactIdHello/artifactId version1.0/version exclusions exclusion groupIdlog4j/groupId artifactIdlog4j/artifactId /exclusion /exclusions /dependency配置后HelloFriend 引入 Hello 时不会自动引入 log4j。3.6 仓库3.6.1 仓库的概念Maven 仓库用来存放项目依赖的第三方 jar 包以及项目构建输出的构件jar、pom 等。 仓库的类型分为三类本地仓库 local中央仓库 central远程仓库 remote私服3.6.2 本地仓库Maven 本地仓库安装完成后不会自动创建第一次执行 maven 命令时才生成。运行 Maven 时优先从本地仓库读取构件本地找不到会从远程仓库下载到本地仓库再使用。 默认路径WindowsC:\Users\用户名\.m2\repository修改方式在Maven_HOME/conf/settings.xml中修改localRepository标签自定义本地仓库路径。实操提示我们之前 Hello 项目执行mvn clean install就是将 Hello 的 jar 包安装到本地仓库供 HelloFriend 引用。3.6.3 中央仓库Maven 中央仓库是 Maven 社区提供的公共仓库内置大量开源 Java 构件。由 Maven 社区管理无需额外配置需要联网访问绝大多数常用 jar 包都存放在中央仓库我们通过坐标下载。3.6.4 依赖搜索顺序Maven 查找构件顺序先查找本地仓库找到直接使用本地仓库没有去中央仓库下载配置了私服则优先访问私服远程仓库3.7 生命周期3.7.1 生命周期的概念Maven 生命周期是对项目构建流程的抽象生命周期本身不做实际工作只定义一套阶段顺序。 真正干活的是插件插件绑定到生命周期阶段执行对应的功能。 Maven 有三套相互独立的生命周期clean清理项目default构建项目最核心site建立项目站点3.7.2 完整生命周期执行顺序由上到下clean 生命周期pre-clean → clean → post-cleandefault 生命周期核心validateinitializegenerate-sourcesprocess-sourcesgenerate-resourcesprocess-resourcescompile 【编译源码】process-classesgenerate-test-sourcesprocess-test-sourcesgenerate-test-resourcesprocess-test-resourcestest-compileprocess-test-classestest 【执行单元测试】prepare-packagepackage 【打包】pre-integration-testintegration-testpost-integration-testverifyinstall 【安装到本地仓库】deploy 【部署到远程私服】site 生命周期pre-site → site → post-site → site-deploy规则执行后面阶段Maven 会自动顺序执行前面所有阶段。 例执行mvn install会自动执行 compile、test、package最后执行 install。3.8 Maven 插件Maven 生命周期的每一个阶段都绑定对应的插件目标真正干活的是插件。生命周期阶段绑定插件插件目标功能cleanmaven-clean-pluginclean 清理 target 目录process-resourcesmaven-resources-plugin复制资源文件compilemaven-compiler-pluginjava 源码编译generate-test-resourcesmaven-resources-plugin复制测试资源test-compilemaven-compiler-plugin编译测试源码testmaven-surefire-plugin执行单元测试packagemaven-jar-pluginjar 打包war 项目使用 maven-war-plugininstallmaven-install-plugin将构件安装到本地仓库deploymaven-deploy-plugin部署构件到远程私服sitemaven-site-plugin生成项目站点文档
阅读完成 · 觉得有帮助?
咨询建站