Java Maven

1.maven坐标依赖

1.1 坐标

<groupId>com.sdc</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

① groupId: 定义当前Maven项目隶属的实际项目。

② artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。

③ version :该元素定义Maven项目当前所处的版本。

④ packaging:该元素定义Maven项目的打包方式(默认jar[war,pom,maven-plugin,ear])。

⑤ classifier:该元素用来帮助定义构架输出的一些附属构件(次元素不能直接定义,因为生成的附属构件有支持的插件实现)。

上述5个元素中,groupId、artifactId、version是必须定义的,packaging时可选项(默认jar),而classifier是不能直接定义的。


1.2 依赖

	<dependency>
  		<groupId>...</groupId>
  		<artifactId>..</artifactId>
  		<version>...</version>
  		<type>依赖的类型,对应于项目左边定义的packaging。(默认jar)</type>
  		<scope>依赖的范围</scope>
  		<optional>标记依赖是否可选</optional>
  		<exclusions>
  			<exclusion>
  				用来排除传递性依赖
  			</exclusion>
  			...
		</exclusions>
  	</dependency>

1.2.1 依赖范围

依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有一下几种依赖范围:

compile:编译依赖范围。默认依赖范围。对于编译、测试、运行三种classpath都有效。例子:spring-core 在三个范围内都需要使用该依赖。

test:测试依赖范围。只对于测试classpath有效。典型的例子:jUnit

provided:已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。例子:servlet-api

runtime:运行时依赖范围。对于测试和运行classpath有效,但在编译主代码时无效。例子:jdbc驱动实现。

system:系统依赖范围。与provided依赖范围一致。但使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。(可在成构建的不可移植,慎用)

importMaven 2.0.9及以上):导入依赖范围。(继承)


1.2.2 依赖传递

Maven 依赖调解(Dependency Mediation)的第一原则是:路径最近者优先。

Maven定义了依赖调解的第二原则:第一声明者优先。


1.2.3 可选依赖

<optional>true</optional> :

对直接依赖当前项目(A)的项目(B)会产生影响。但对依赖项目(B)的项目(C)而言,项目(A)不会对项目(C)产生任何影响。


1.2.4 优化依赖

查看已解析依赖: mvn dependency:list

(已解析依赖:经过依赖处理后,确保任何一个构件只有唯一额版本在依赖中存在、)

查看依赖树:mvn dependency:tree

分析依赖关系: mvn dependency:analyze

(只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它就发现不了。例:spring-corespring-beans是运行项目必要的类库,但分析时可能显示费必须依赖,但显然是不能直接删除spring依赖的)


学习资料: 《maven实战》

(图片来源网络!



转载请指明出处!http://www.miselehe.com/article/view/8