Posted on 2011-03-04 16:29
landor 阅读(735)
评论(0) 编辑 收藏 所属分类:
maven
1 dependency中的scope
compile:默认,编译范围,会被打包;
provide:已经提供范围,比如文件A.java在打包的时候需要xxx.jar,这个jar在目标环境中已经存在了,我们不需要把他也一起打包,就用provided
runtime:编译的时候不需要,运行和测试的时候需要;
test:在编译和运行的时候不需要,只有在测试的时候才需要;
system:类似provided,但是必须提供依赖的路径,比如所以来的jar文件的位置;这样maven不会在本地仓库中寻找它了;不被推荐使用;
2
dependency中的version
(, )不包含,[, ]包含,例如:
<version>1.4.1</version> 版本是1.4.1
<version>[3.8,4.0)</version> 版本是>=3.8并且<4.0
<version>[,4.0)</version> 版本是任何<4.0
<version>[3.8,)</version> 版本是任何>=3.8
3
dependency是传递的
比如spring依赖common-xxx依赖,我们只需要引入spring dependency即可,maven会自动去找spring的那些依赖;
4
dependency依赖排除
有时候A依赖B,B依赖C,但是C在中央仓库或者你的仓库中没有,就会有问题。比如hibernate依赖Sun JTA API,但是他在中央Maven 仓库中没有,而在仓库中有另一个JTA实现,并不是Sun的,就可以这么用:
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
这两个依赖是没有关系的,只不过是在geronimo-jta_1.1_spec提供的内容正好是hibernate所需要的;
5
dependencyManagement的作用
挡在parent pom.xml中定义了dependencyManagement之后,子项目可以引用它而不用声明版本号,就是说他会默认parent pom.xml中的版本号,比如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.2</version>
</dependency>
<dependencies>
</dependencyManagement>
那么子项目就可以引用它:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>a-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>project-a</artifactId>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
可以在子pom.xml中写版本,那样会覆盖parent pom.xml中的依赖的版本;