我有以下情况:
project-A
project-B, depends on project-A
project-C, depends on project-B
war-project, depends on project-C
然后,由于传递依赖性,project-C可以访问project-A。我不喜欢这个,因为它允许我直接使用项目-A中的东西,项目-B打算封装(让我们留下项目-B是DAO项目,而项目-A是Hibernate ...我不知道希望能够在项目C中使用Hibernate的东西。
但是,最终的战争工件必须包含运行应用程序所需的所有内容,即A,B和C.如何以干净的方式实现此目的?
我基本上正在寻找一种可以在项目B的pom中使用的新范围:
<dependency>
<artifact>project-A</artifact>
<scope>not-transitive-but-include-in-war</scope>
<!-- this dependency is needed internally only, but should not be exported as it is not needed to use this project -->
</dependency>
<dependency>
<artifact>some-other-dependency</artifact>
<!-- regular transitive dependency, that for example is used in the API -->
</dependency>
我尝试在项目C中使用排除项目(一个半定义的解决方案,因为它仍然需要项目A的知识),并且也没有工作,因为项目-A没有被包含在战争中
我也尝试使用提供的/可选的范围。没有工作,他们没有参加战争。
我不想仅将依赖项添加到war项目中。这要求我再次了解项目-A。
因为它允许我确保某些项目不会意外地开始使用它们不应该使用的依赖项。现在打破分层是太容易了,因为所有依赖都是可传递的(即,我可以在Web级别使用Hibernate,或者在每个依赖项目中使用apache-commons,google-collections等几十个util项目之一,而我们例如想要在某些项目中仅使用JDK内容。)