1.包的依赖
dependency的包有几个作用域:
runtime表示运行的时候依赖,编译的时候不依赖。例如连接数据库的包,
compile:编译的时候依赖。默认
provided:编译测试的时候有效,最后生成的项目包中没有这种jar包。例如servlet-api,
test:测试的时候有效,其他时候都没用,例如junit,
打包时只有runtime和compile可以包含。
依赖还可以传递:
jar包的级别是:自己项目pom中dependency的jar包级别最高,然后是引用其他项目的jar包次一级,更次一级的是引用两个项目,都有A.jar,但是在B项目中是直接引用A.jar,C项目是通过D.jar来引用的A.jar(间接引用),那么C中的A.jar比B中的A.jar次一级。以此类推。(一个项目只能引用另一个项目compile和runtime范围的包,只要package时能被包含就能被引用)
如果引用有相同的jar包但是版本不同,引用的是级别最高的,如果级别一样,根据dependency的顺序来引用,谁在前就引用谁的。
但是还可以排除掉某个项目中的jar包。
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>java-test</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
直接引用:dependency中引用的。间接引用:dependency中的jar包里面包含的jar包
举个例子,A,B,C三个项目,A直接引用a-1.0,b-1.0,c-1.0,B直接引用a-2.0,b-2.0,b-2.0引用c-1.5,C项目直接引用a-3.0,引用B,C项目,B在C前面。那么C项目引用的jar包为a-3.0,b-2.0,c-1.0。
2.继承
如果一个项目有多个maven模块,如果不用聚合那么每次打包每个模块都要运行,但是用来聚合后,只运行一次就行了。
新建一个maven,package选择pom不选jar或war。然后在pom文件中加入:
<modules>
<module>../a-core</module>//模块相对于pom文件的位置
<module>../a-util</module>
<module>../a-web</module>
</modules>
如果多个模块有相同的内容,那么就可以用一个父模块来实现相同的内容,其他模块只要继承父模块就行了。父模块package选择pom,不选jar或war。
<modelVersion>4.0.0</modelVersion>
<groupId>test.java</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../java-depend</module>
<module>../java-test</module>
</modules>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
父模块中把所有jar包都引用进来,子模块就不用配置jar包的版本和作用域了。子模块:
<modelVersion>4.0.0</modelVersion>
<parent>//引用父模块
<groupId>test.java</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>//父模块的pom文件
</parent>
<artifactId>java-depend</artifactId>
<packaging>jar</packaging>
<name>java-depend</name>
<dependencies>
<dependency>//依赖不用版本和作用域了,都在父模块里
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>java-test</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
子模块的直接依赖会覆盖父模块的依赖。