依赖
我们项目中依赖的 Jar 包可以通过依赖的方式引入, 通过在 dependencies 元素下添加 dependency 子元素, 可以声明一个或多个依赖. 通过控制依赖的范围, 可以指定该依赖在什么阶段有效. Maven 的几种依赖范围:
compile(默认): 编译范围, 编译和打包都会依赖.
provided: 提供范围, 编译时依赖, 但不会打包进去. 如: servlet-API.jar
runtime: 运行时范围, 打包时依赖, 编译不会. 如: MySQL-connector-java.jar
test: 测试范围, 编译运行测试用例依赖, 不会打包进去. 如: junit.jar
system: 表示由系统中 CLASSPATH 指定. 编译时依赖, 不会打包进去. 配合 < systemPath> 一起使用. 示例: java.home 下的 tool.jar
system 除了可以用于引入系统 classpath 中包, 也可以用于引入系统非 maven 收录的第三方 Jar, 做法是将第三方 Jar 放置在 项目的 lib 目录下, 然后配置 相对路径, 但因 system 不会打包进去所以需要配合 maven-dependency-plugin 插件配合使用. 当然推荐大家还是通过 将第三方 Jar 手动 install 到仓库.
- <!-- system 的通常使用方式 -->
- <dependency>
- <groupId>
- com.sun
- </groupId>
- <artifactId>
- tools
- </artifactId>
- <version>
- ${java.version}
- </version>
- <scope>
- system
- </scope>
- <optional>
- true
- </optional>
- <systemPath>
- ${java.home}/../lib/tools.jar
- </systemPath>
- </dependency>
依赖是具有传递性的, 例如 Project A 依赖于 Project B,B 依赖于 C, 那么 B 对 C 的依赖关系也会传递给 A, 如果我们不需要这种传递性依赖, 也可以用 < optional> 去除这种依赖的传递
- <dependency>
- <groupId>
- commons-logging
- </groupId>
- <artifactId>
- commons-logging
- </artifactId>
- <version>
- 1.1.1
- </version>
- <optional>
- true
- <optional>
- </dependency>
假设第三方的 jar 包中没有使用 <optional> 来去除某些依赖的传递性, 那么可以在当前的 POM 文件中使用 <exclusions> 元素声明排除依赖, exclusions 可以包含一个或者多个 exclusion 子元素, 因此可以排除一个或者多个传递性依赖.
- <dependency>
- <groupId>
- org.springframework
- </groupId>
- <artifactId>
- spring-core
- </artifactId>
- <exclusions>
- <exclusion>
- <groupId>
- commons-logging
- </groupId>
- <artifactId>
- commons-logging
- </artifactId>
- </exclusion>
- </exclusions>
- </dependency>
聚合
现实中一个项目往往是由多个 project 构成的, 在进行构建时, 我们当然不想针对多个 project 分别执行多次构建命令, 这样极容易产生遗漏也会大大降低效率. Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来, 将父模块的打包类型声明为 POM, 通过 <modules> 将各模块集中到父 POM 中. 如清单 7, 其中 <module></module> 中间的内容为子模块工程名的相对路径.
清单 7. 聚合
- <modules>
- <module>
- ../com.dugeng.project1
- </module>
- <module>
- ../com.dugeng.project2
- </module>
- </modules>
父类型的模块, 不需要有源代码和资源文件, 也就是说, 没有 src/main/java 和 src/test/java 目录. Maven 会首先解析聚合模块的 POM 文件, 分析要构建的模块, 并通过各模块的依赖关系计算出模块的执行顺序, 根据这个潜在的关系依次构建模块. 将各子模块聚合到父模块中后, 我们就可以对父模块进行一次构建命令来完成全部模块的构建.
继承
继承是指子工程直接继承父工程 当中的属性, 依赖, 插件等配置, 避免重复配置.
例如将 com.dugeng.parent 这个模块声明为 project1 和 project2 的父模块, 那么我们在 project1 和 2 中用如下代码声明父子关系,
- <parent>
- <groupId>
- com.dugeng.mavenproject
- </groupId>
- <artifactId>
- com.dugeng.parent
- </artifactId>
- <version>
- 0.0.1-SNAPSHOT
- </version>
- <relativePath>
- ../com.dugeng.parent/pom.xml
- </relativePath>
- </parent>
由于父模块只是用来声明一些可共用的配置和插件信息, 所以它也像聚合模块一样只需要包括一个 POM 文件, 其它的项目文件如 src/main/java 是不需要的.
聚合和继承存在一些共性和潜在的联系, 在实际的应用中, 经常将聚合模块的父模块和继承的父模块定义为同一个.
来源: http://www.bubuko.com/infodetail-2945553.html