西宁网站制作哪里好,网站页尾设计,安岳建设局网站,搭建网页游戏服务器【0】README1#xff09;本文部分文字转自 “maven实战”#xff0c;旨在 review “maven(5)坐标和依赖” 的相关知识#xff1b;【2】坐标详解 1#xff09;intro#xff1a;坐标用于定位 类库#xff0c;而一组maven 坐标通过一些元素来进行定义的#xff1a;groupId…【0】README1本文部分文字转自 “maven实战”旨在 review “maven(5)坐标和依赖” 的相关知识【2】坐标详解 1intro坐标用于定位 类库而一组maven 坐标通过一些元素来进行定义的groupId artifactIdversion packaging classifier对以上元素的分析AnalysisA1groupId定义当前 maven 项目隶属的实际项目maven 项目和 实际项目不是一一对应的如spring framework是一个实际项目而 maven 项目有很多如 spring-core spring-context等 A2artifactId定义实际项目中的一个 maven 项目模块使用实际项目名称作为 artifactId的前缀以便于寻找实际构件其groupId 为spring而artifaceId 为 spring-aop 或 spring-core 等等 A3packaging该元素定义 maven 项目的打包方式打包方式有 jar 和 war 前者是默认的 A4classifier用来帮助定义构建输出的一些附属构件。附属构件 与 主构件 相对应如主构件 spring-aop-4.2.6.RELEASE.jar 其附属构件还可以是 spring-aop-4.2.6.RELEASE-javadoc.jarspring-aop-4.2.6.RELEASE-sources.jar干货——引入了主构件和附属构件 AttentionA1以上坐标的5个元素前3个是必须的而 packaging 是可选的而 classifier 是不能直接定义的 A2项目构件的文件名和坐标是对应的规则为 artifactId-version [-classfier].packaging 【4】依赖配置1intro其定义如下project
......
dependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.7/versiontype..../type scopetest/scopeoptional.../optionalexclusionsexclusion.../exclusion/exclusions/dependency/dependencies
...
/project对以上代码的分析AnalysisA1type是依赖类型 默认为jar 不必声明 A2scope依赖的范围testcompile(默认) A3optional标记是否可选 A4exclusions用来排除传递性依赖 【5】依赖范围1maven 在编译项目主代码的时候需要用到一套 classpathclasspath1首先编译项目主代码的时候需要用到 spring-core该文件以依赖的方式被引入到 classpath中 classpath2其次maven 在编译和执行测试的时候会使用另外一套 classpath classpath3最后实际运行maven 项目的时候又会使用一套 classpath 2intro依赖范围就是用来控制依赖与这三种classpath编译classpath 测试 classpaht 运行classpath的关系maven 有以下几种依赖范围scope1compile编译依赖范围 scope2test测试依赖范围 scope3provided已提供依赖范围 scope4runtime运行时 依赖范围 scope5system系统依赖范围最好不要使用 scope6import导入依赖范围 3上述除了 import以外的各种依赖范围与 三种classpath 的关系如下表所示【6】传递性依赖【6.1】何为传递性依赖1problem solution1.1problem考虑一个基于 spring framework 的项目如果不使用 maven 那么在项目中就需要 手动下载相关依赖 1.2solutionmaven 的 传递性依赖就可以很好解决这个问题 2看个荔枝 以 spring mvc 项目为荔枝其有一个 spring-core-4.2.6.RELEASE.jar 的依赖而上述jar 还会依赖于 commons-logging-1.2.jarspringmvc 项目依赖于spring-core而sring-core 依赖于 commons-logging则 springmvc 项目就传递依赖于 commons-logging则传递依赖如下干货——传递性依赖的定义【6.2】传递性依赖和依赖范围1intro依赖范围不仅可以控制依赖 与 三种 classpath 的关系还对传递性依赖产生影响2第1直接依赖第2直接依赖对于 springmvc项目spring-core就是第1直接依赖而 commons-logging 就是 第2直接依赖3第1和第2直接依赖的范围决定了传递性依赖的范围如下表所示最左边一列表示第1直接依赖范围而最上一行表示第2直接依赖范围中间的交叉单元格则表示传递依赖性范围对上表的分析Analysis看第2行当第1 为 test第2为compile的时候其传递依赖的范围是 test那所以 如果 spring-core compile 而 commons-logging test依赖范围则 commons-logging 相对于 springmvc 项目的依赖范围是 test 【7】依赖调节1intro当依赖发生冲突时需要依赖调节2看个荔枝荔枝1如项目A 有这样的依赖关系 A-B-C-X(1.0) AND A-D-X(2.0)则 依赖调节的第一原则是路径最近者优先长度最短者所以会选择 X(2.0) 荔枝2如项目A 有这样的依赖关系 A-B-X(1.0) AND A-D-X(2.0)则依赖调节的第二原则是第一声明者优先在长度相等的case下在pom 中声明的顺序决定了谁会被使用干货——调节依赖的第一和第二原则 【8】可选依赖1intro项目A 依赖 项目B项目B 依赖于 项目X 和 Y则 B 对于 X 和 Y 都是 可选依赖 A-B AND B-X(OPTIONAL) AND B-Y(OPTIONAL)2根据传递性依赖的定义如果这3个依赖的范围都是 compile那么 X and Y 就是 A 的 compile 范围的传递性依赖了。然而由于 X and Y 是 可选依赖依赖将不会得以传递换句话说X and Y 将不会对 A 有任何影响如下图所示3为什么要使用可选依赖呢?如B是一个持久层框架包 它支持多种数据库包括MySQL oracle在构建这个 工具包的时候需要这两种数据库的驱动程序但在使用的时候只会用到其中一个 驱动程序项目B的声明如下对以上代码的分析Analysis 因为项目B 依赖的驱动程序 是 可选的所以当 项目如A 依赖 B 的时候该驱动程序项目的这个依赖将不会传递即项目A 不会依赖 驱动程序这个项目ConclusionC1在理想case下是不应该使用可选依赖的。因为在面向对象设计中有一个 单一职责性原则指一个类应该只有一个职责而不是柔和太多的职责 C2那所以在上面的case上就应该 分别为 mysql 和 oracle 创建一个 maven项目基于同样的 groupId 不同的 artifactId 在各自的 pom 中声明对应的 jdbc 驱动依赖而不是使用可选依赖 【9】 最佳实践【9.1】排除依赖1由于某些原因不想依赖以前声明的 maven 项目了2看个荔枝项目A 依赖 项目B而不想引入对项目C 的依赖而是自己显示地 声明对于 项目 C1.1.0 版本的依赖代码中使用 exclusions 元素声明排除依赖exclusions 可以有多个 exclusion 子元素3该实例的逻辑图如下所示【9.2】归类依赖1intro在某个地方声明 项目的版本 对 多个项目进行归类2看个荔枝关于 springframework项目【9.3】优化依赖1intromaven 会自动解析所有项目的直接依赖和传递性依赖并且根据规则正确判断每个依赖的范围对于一些依赖冲突maven 也可以进行调节以确保任何一个构件只有唯一的版本在依赖中存在2已解析依赖在上述工作做完后最后得到的那些依赖称为 已解析依赖干货——引入已解析依赖3可以运行 mvn dependency:list 查看 已解析依赖D:\classical_books\java_set\maven_in_action\mycode\chapter3mvn dependency:list
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT
[WARNING] build.plugins.plugin.version for org.apache.maven.plugins:maven-compiler-plugin is missing. line 22, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building service says hello maven. 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) service ---
[INFO]
[INFO] The following files have been resolved:
[INFO] junit:junit:jar:4.7:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.462 s
[INFO] Finished at: 2016-06-18T20:52:4008:00
[INFO] Final Memory: 13M/153M
[INFO] ------------------------------------------------------------------------4依赖树这些依赖被解析后会构成一个 依赖树通过这颗树就可以清楚地看到某个依赖是通过哪条路径引入的 干货——引入依赖树5运行 mvn dependency:tree 查看D:\classical_books\java_set\maven_in_action\mycode\chapter3mvn dependency:tree
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT
[WARNING] build.plugins.plugin.version for org.apache.maven.plugins:maven-compiler-plugin is missing. line 22, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building service says hello maven. 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) service ---
[INFO] com.maven.chapter3:service:jar:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:4.7:test // 传递性依赖该项目会传递依赖于 junit;
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.172 s
[INFO] Finished at: 2016-06-18T20:54:2608:00
[INFO] Final Memory: 13M/217M
[INFO] ------------------------------------------------------------------------6分析当前项目的依赖 mvn dependency:analyzeD:\classical_books\java_set\maven_in_action\mycode\chapter3mvn dependency:analyze
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT
[WARNING] build.plugins.plugin.version for org.apache.maven.plugins:maven-compiler-plugin is missing. line 22, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building service says hello maven. 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] maven-dependency-plugin:2.8:analyze (default-cli) test-compile service
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) service ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) service ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) service ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) service ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] maven-dependency-plugin:2.8:analyze (default-cli) test-compile service
[INFO]
[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) service ---
[INFO] No dependency problems found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.028 s
[INFO] Finished at: 2016-06-18T20:56:1708:00
[INFO] Final Memory: 15M/222M
[INFO] ------------------------------------------------------------------------对以上console info 的分析AnalysisA1Used undeclared dependencies意指项目中使用到 的但没有显式声明的依赖 A2Unused declared dependencies意指项目中未使用到的但显式声明的依赖 Attention由于mvn dependency:analyze 只会分析 编译主代码 和 测试代码需要用到的 依赖一些执行测试 和 运行时 需要的 依赖它发现不了