网上找半天找不到的结果,自己动手测试一下其实就出来了。好了,言归正传,在大多数分层项目中经常会遇到相互依赖的问题,B项目依赖A项目,C也依赖A项目,这时候用dependency还是用parent呢?
这两者是有区别的:
下面做一个测试,A项目作为一个公共项目,被B项目和C项目所依赖,B以parent的方式,C以dependency的形式。在A项目创建一个类,添加一个方法,然后分别在项目B、C中写测试方法,调用A项目类中的方法。
项目A
添加一个自己写的类TestUtil
import org.apache.commons.lang3.StringUtils;
/**
* @author author
* @date 2018/8/2 14:09
*/
public class TestUtil {
public void show(){
System.out.println(StringUtils.isNotEmpty("123"));
}
}
pom:
<groupId>com.mycompany</groupId>
<artifactId>test1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
</dependencies>
项目A中引入了一个commons-lang3的方法,开发中常用到里面的StringUtils判断字符串的方法,以此为其中一个测试点
接着项目B
pom
<groupId>com.mycompany</groupId>
<artifactId>test15</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>com.mycompany</groupId>
<artifactId>test1</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
然后项目C
pom
<groupId>com.mycompany</groupId>
<artifactId>test20</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>test1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
在B中添加测试类和方法:
import com.test.aa.TestUtil;
import org.apache.commons.lang3.StringUtils;
/**
* @author author
* @date 2018/8/2 14:13
*/
public class Test {
public static void main(String[] args) {
StringUtils.isNotEmpty("");
TestUtil tu=new TestUtil();
tu.show();
}
}
在C中添加同样的测试类和方法。
最后可以发现在B中,通过<parent>引用的项目A,可以使用A项目中<dependency>中依赖的StringUtils的方法,但是不能调用A项目中自己定义的类和方法,C项目中通过<dependency>依赖的A,两者却都可以调用。
然后说下dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.7</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
1.在同一个pom文件下,如果<dependencies>和<dependencyManagement>中都对该jar做了依赖,以<dependencies>的为准,优先级高于<dependencyManagement>。若前者没有对其依赖,而后者对其有依赖,则以后者为准。<dependencyManagement>里只是声明依赖,并不实现引入.
2.在不同的pom文件中,存在父子相互依赖关系的,父项目的pom中<dependencyManagement>中对该jar做了依赖,而子项目中<dependencies>又依赖了该jar,如果子项目中没有指定<version>和<scope>,则继承父项目中该jar的<version>和<scope>。如果子项目中指定了<version>和<scope>,以子项目的为准。