2017-03-16 71 views
1

我有一个maven的问题。我有一个巨大的多模块项目,改变其结构的可能性有限。Maven中的循环依赖和项目的可怕结构

所以,假设我有3个模块:A,B,C。

  • A是B和C的父
  • C使用从类B,所以我们有乙在C的POM文件的依赖关系。
  • B不需要将C作为依赖项来成功编译。

现在,没有任何问题。

不幸的是,B在运行时(spring,ioc,...)中使用了C,所以有人将C添加为B的依赖项,所以我们在Maven中有一个可怕的循环。建立完成失败(类似“检测到周期”在日志中)。我想用这种方式保持它(在B模块中提供某种程度上的C依赖性),因为我需要使用所有需要的JAR压缩文件(包括来自C的JAR)来编译和传递B。

我可以以某种方式构建C并在全面编译B之后将它的JAR复制到B的目标目录中吗?有没有插件或工具可以由maven用来做到这一点?

如果这篇文章不清楚,我会试着更详细地描述它。

在此先感谢;)

+0

创建D.移动的依赖关系D.使B和C取决于D. –

+0

谢谢你,这听起来很不错。不幸的是,该项目有多个模块,恐怕我不能改变它的结构。有没有办法解决我的问题,而无需重新组织整个项目的结构? – KP13

+0

Maven是一个自动化的构建工具。您建议手动黑客构建过程。这不是解决方案。 –

回答

0

这是我该怎么做。从C的POM文件:

<profile> 
    <id>compile</id> 
     <dependencies> 
     <dependency> 
      use B here but do not use in the main dependencies section 
     </dependency> 
      + other dependencies 
     </dependencies> 
    </build> 
</profile> 

例如,你可以编译用C模块mvn compile -Pcompile

从B的POM文件:

<profile> 
    <id>run</id> 
     <dependencies> 
     <dependency> 
      use C here but do not use in the main dependencies section 
     </dependency> 
      + other dependencies 
     </dependencies> 
    </build> 
</profile> 

运行使用mvn yourcommandforrunning -Prun

B模块通过这种方式你可以逃避循环依赖问题。

0

听起来好像有两个问题:

  1. 如何告诉Maven的有关文物之间的仅运行时依赖。
  2. 如何让Maven利用依赖将所有相关的依赖集中在一起。

Maven具有依赖管理功能,可以使用依赖项元素的“范围”元素通知maven这些细微差别。在这种情况下,我想你想

<scope>runtime</scope> 

查看documentation。特别是:

运行时 - 此范围指示编译时不需要依赖项,但是用于执行。它在运行时和测试类路径中,但不在编译类路径中。

正确利用运行时间scope应解决循环依赖性问题。

关于第二个问题,你有没有提供足够的信息,以提供一个明确的答案。但是,您几乎可以肯定地想要使用Maven插件来利用Maven有关依赖关系的信息。例如,如果您想生成一个包含所有内容的单个“胖”jar文件,您需要查看maven-shade-plugin。另一个选项是maven-assembly-plugin,它非常灵活,并且可以包含程序集中的所有依赖项。还有其他插件擅长处理各种其他常见情况。如果您在使用特定插件时遇到问题,您可能需要制定一个单独的问题。