如何拥有一个自动包含在war中的私有maven依赖项?

如何拥有一个自动包含在war中的私有maven依赖项?,maven,dependencies,war,Maven,Dependencies,War,我有以下情况: project-A project-B, depends on project-A project-C, depends on project-B war-project, depends on project-C 然后,由于可传递的依赖关系,project-C可以访问project-A。我不喜欢这样,因为它允许我直接使用project-B打算封装的project-A中的内容(让我们保持不变project-B是DAO项目,project-A是Hibernate…我不想在proj

我有以下情况:

project-A
project-B, depends on project-A
project-C, depends on project-B
war-project, depends on project-C
然后,由于可传递的依赖关系,project-C可以访问project-A。我不喜欢这样,因为它允许我直接使用project-B打算封装的project-A中的内容(让我们保持不变project-B是DAO项目,project-A是Hibernate…我不想在project-C中使用Hibernate内容)

然而,最终的war工件必须包含运行应用程序所需的一切,即A、B和C。我如何以干净的方式实现这一点

我基本上是在寻找一种可用于project-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>

项目A
不及物但包含在战争中
其他依赖
我尝试在project-C中使用排除(一个半途而废的解决方案,因为它仍然需要project-a的知识),但也没有成功,因为project-a没有被包括在战争中

我还尝试使用提供的/可选的作用域。不起作用,他们就不会被卷入战争

我不想只向war项目添加依赖项。这要求我再次了解A项目

我为什么要这个?
因为它允许我确保某些项目不会意外地开始使用它们不应该使用的依赖项。现在很容易打破分层,因为所有依赖性都是可传递的(即,我可以在Web层使用Hibernate或几十个Upache项目中的一个,比如Apache CAMON,每个依赖项目中的谷歌集合,而我们例如希望在某些项目中只使用JDK的东西)。我又看了一遍问题,明白了。我想你能做到这一点的唯一方法就是创建自己的编译器插件。当这个自定义插件执行时,您可以将可用的依赖项限制为当前pom中直接定义的依赖项。如果项目已编译,则一切正常,如果未编译,则您知道它依赖于可传递依赖项,并且可能会导致生成失败。在
projectB
的pom中设置
projectA
依赖项
可选
,并在
war项目中明确声明
projectA
依赖项,只需阅读您不想在
warproject
的POM中声明
project-A
。但你可能分析过度了;任何项目都有权了解其所有直接和间接依赖关系。这就是您可以更好地控制项目的依赖项、版本等的原因。而FWIW,我们没有办法用现有的来实现,您可能必须推出自己的实现。