标签归档:Maven

Maven仓库

Aliyun (推荐)

OSChina(目前已经打不开了)

repo2

net-cn

uk

ibiblio

jboss

maven依赖仲裁

模块化的问题是无法避免的一个问题。这里有一个案例是项目里依赖了b组件,b组件依赖了a组件1.0.2版本,而用户也直接在pom依赖了a组件并声明的1.0.0版本,结果在仲裁时选择了1.0.0版本的a组件:

[code]+- com.xxx:a:jar:1.0.0:compile
|
+- …
| +- …
|
+- com.xxx:b:jar:1.0.0:compile
| |
| +- (com.xxx:a:jar:1.0.2:compile – omitted for duplicate)[/code]

对于依赖某个组件的多个版本,maven的仲裁过程,并不是简单的使用高版本,而是根据从根节点到各个组件节点之间的路径深度,路径短的组件优先,如果路径深度相同,则是先发现的那个。类似一棵树的广度遍历。

总结一下Maven的依赖仲裁原则:第一原则:最短路径优先;补充原则:优先声明;对于补充原则并不可靠,如碰上pom重构调整顺序后可能导致问题再次出现,这个点需要注意。

Maven中的DependencyManagement和Dependencies

这里介绍一个在父项目中的根结点中声明dependencyManagement和dependencies的区别

dependencyManagement
Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素。使用pom.xml 中的dependencyManagement 元素能让
所有在子项目中引用一个依赖而不用显式的列出版本号。Maven 会沿着父子层次向上走,直到找到一个拥有dependencyManagement 元素的项目,然后它就会使用在这个dependencyManagement 元素中指定的版本号。

例如在父项目里:

[xml]<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.2</version>
</dependency>

<dependencies>
</dependencyManagement>[/xml]

然后在子项目里就可以添加mysql-connector时可以不指定版本号,例如:

[xml]<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies> [/xml]

这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。

dependencyManagement
只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。
dependencies
相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
一句话概括:
dependencies中的jar直接加到项目中,dependencyManagement 是对子项目中可能使用的依赖进行管理,本项目中可能并不使用这些依赖

classifier
如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier)。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4 编译器,另一个使用Java 6 编译器,你就可以使用分类器
来生成两个单独的JAR构件,它们有同样的groupId:artifactId:version组合。如果你的项目使用本地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。分类器常用于打包构件的源码,JavaDoc 或者二进制集合。

Missing artifact com.sun:tools:jar 1.5.0

刚开始使用eclipse,各种各样神奇的问题,确实很想吐槽。比如:

使用m2eclipse插件时,在pom.xml中添加struts2-core.jar包后,需要依赖java运行时的tools.jar进行依赖。
但是,此时eclipse无法读取tools包,出现如下错误:
Missing artifact com.sun:tools:jar 1.5.0

解决办法一:
手动配置pom.xml,添加一个dependency如下:

[xml]<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<scope>system</scope>
<systemPath>${JAVA_HOME}/../lib/tools.jar</systemPath>
</dependency>[/xml]

我在pom.xml添加如下代码后就解决了:

[xml]<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>C:/Program Files/Java/jdk1.6.0_27/lib/tools.jar</systemPath>
</dependency> [/xml]

解决办法二:
首先,查看错误列表windows->Show View->Problems,在有以上问题的同时,还会出现该错误。
The container ‘Maven Dependencies’ references non existing library ‘C:\Documents and Settings\DELL\.m2\repository\com\sun\tools\1.5.0\tools-1.5.0.jar’
大致说:找不到该tools-1.5.0.jar。
所以将C:\Program Files\Java\jdk1.6.0_10\lib\目录下的tools.jar拷贝到C:\Documents and Settings\DELL\.m2\repository\com\sun\tools\1.5.0\目录下,并将tools.jar改名为tools-1.5.0.jar,并在pom.xml中作如下配置:

[xml]<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
</dependency>[/xml]

第二种比较麻烦,推荐第一种吧。

转载地址:http://blog.csdn.net/jazz2013/article/details/8596198