MAVEN学习-2

1.多模块企业级项目依赖

http://www.sonatype.com/book/mvn-examples-1.0.zip或者http://www.sonatype.com/book/mvn-examples-1.0.tar.gz。

2.优化依赖(父子项目、多子模块相互依赖)

上移共同的依赖至 dependencyManagement如果多于一个项目依赖于一个特定的依赖,你可以在 dependencyManagement 中列出这个依赖。父POM包含一个版本和一组排除配置,所有的子POM需要使用 groupId 和 artifactId 引用这个依赖。如果依赖已经在 dependencyManagement 中列出,子项目可以忽略版本和排除配置。优化和重构POM为兄弟项目使用内置的项目version和groupId使用 {project.version} 和org.sonatype.mavenbook 来引用兄弟项目。兄弟项目基本上一直共享同样的groupId,也基本上一直共享同样的发布版本。使用 0.6-SNAPSHOT 可以帮你避免前面提到的兄弟版本不一致问题。

3.Maven提供了三个隐式的变量,可以用来访问环境变量,POM信息,和Maven Settings

env

env 变量 暴露了你操作系统或者shell的环境变量。例如,在Maven POM中一个对 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/bin:/usr/local/bin:/usr/local/maven/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/java/latest/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin:/usr/local/bin 的引用将会被 /usr/local/bin:/usr/local/maven/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/java/latest/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin:/usr/local/bin 环境变量替换(或者Windows中的 %PATH% )。

project

project 变量暴露了POM。你可以使用点标记(.)的路径来引用POM元素的值。例如,在本节中我们使用过 groupId 和 artifactId 来设置构建配置中的 finalName 元素。这个属性引用的语法是: org.sonatype.mavenbook-${project.artifactId} 。

settings

settings 变量暴露了Maven settings信息。可以使用点标记(.)的路径来引用 settings.xml 文件中元素的值。例如, ${settings.offline} 会引用 ~/.m2/settings.xml 文件中 offline 元素的值。

我们还可以通过 pom.xml 或者 settings.xml 中的 properties 元素设置自己的属性,或者还可以使用外部载入的文件中属性。如果你在 pom.xml 中设置了一个名为 fooBar 的属性,该属性就可以通过 ${fooBar} 引用。当你构建一个系统,它针对不同的部署环境过滤资源,那么自定义属性就变得十分有用。这里是在POM中设置 ${foo}=bar 的语法:

bar

4.依赖范围

org.apache.geronimo.specs

geronimo-servlet_2.4_spec

1.0

provided

provided定义;

项目依赖”简要介绍了三种依赖范围: compile , test ,和 provided 。范围控制哪些依赖在哪些classpath中可用,哪些依赖包含在一个应用中

compile(编译范围)

compile 是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。

provided(已提供范围)

provided 依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。

runtime(运行时范围)

runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。

test(测试范围)

test 范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。测试范围依赖在之前的???中介绍过。

system(系统范围)

system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。

5. 可选依赖 true

比如某模块

4.0.0

org.sonatype.mavenbook

my-project

1.0.0

net.sf.ehcache

ehcache

1.4.1

true 注意这儿

swarmcache

swarmcache

1.0RC2

true 注意这儿

另一个模块

4.0.0

org.sonatype.mavenbook

my-application

1.0.0

org.sonatype.mavenbook

my-project 引用了上面一个模块

1.0.0

net.sf.ehcache 声明选择了这个依赖

ehcache

1.4.1

也就是说当A模块的某个jar设置可选依赖后,B模块依赖了A模块时想用ehcache jar 也得再次配置。默认为false

6.依赖版本界限

(, )

不包含量词

[, ]

包含量词

[3.8,4.0) 指定一个依赖界限: 3.8 - 4.0

[,3.8.1] 指定一个依赖界限: <= 3.8.1

在逗号前面或者后面的版本不是必须的,这种空缺意味着正无穷或者负无穷。

如果你指定[3.8.2],它意味只有3.8.2会被使用,没有其它。如果其它什么地方有一个版本指定了[3.8.1],你会得到一个构建失败报告,告诉你有版本冲突。我指出这一点是要让你知道有这一选项,但要保守的使用它,只有在确实需要的时候才使用。更好的做法是通过 dependencyManagement 来解决冲突。

7.传递性依赖和范围

MAVEN学习-2

8. 依赖冲突解决


分享到:


相關文章: