Java 如何解决Eclipse中的循环项目依赖关系。有没有办法只在运行时创建一个依赖项?

Java 如何解决Eclipse中的循环项目依赖关系。有没有办法只在运行时创建一个依赖项?,java,eclipse,maven,circular-dependency,Java,Eclipse,Maven,Circular Dependency,我有一个项目,基本上由2个模块组成。我有一个Eclipse工作区和两个java项目(maven),它们代表这两个模块 要更深入一点,请执行以下操作: 项目1:核心模块(具有核心实现和API接口) 项目2:辅助模块(服务器) Project 2需要将Project 1作为依赖项,以便在编译时访问API接口。但问题是project1需要project2才能正常工作(不过这只是一个运行时要求) 因此,当我在每个项目中添加另一个项目作为依赖项时,会显示一个循环依赖项错误,因为Eclipse不知道以什

我有一个项目,基本上由2个模块组成。我有一个Eclipse工作区和两个java项目(maven),它们代表这两个模块

要更深入一点,请执行以下操作:

  • 项目1:核心模块(具有核心实现和API接口)
  • 项目2:辅助模块(服务器)
Project 2需要将Project 1作为依赖项,以便在编译时访问API接口。但问题是project1需要project2才能正常工作(不过这只是一个运行时要求)

因此,当我在每个项目中添加另一个项目作为依赖项时,会显示一个循环依赖项错误,因为Eclipse不知道以什么顺序编译这些类

我成功完成这项工作的方法是,我将project2中的“bin”文件夹作为依赖项添加到project1以及所有project2依赖项(基于maven)。这使得整个项目完全绑定到我的系统,因为所有路径都根据我的计算机设置进行了调整

有没有合适的方法来指定另一个项目只依赖于“运行时”,而不依赖于“编译”并避免Eclipse中的循环冗余


以更直观的方式解释。我需要的是:

  • 项目2——编译过程取决于--->项目1

  • 项目1——运行期间取决于--->项目2


在Maven中,依赖项有一个作用域。它们可以声明为“编译”、“运行时”、“测试”等

您可以在Project2的Project1中声明编译依赖项,在Project2的Project1中声明运行时依赖项。我从未尝试过以这种方式定义依赖关系,但它可能会起作用


但是,更重要的是:如果Project1不能在没有Project2的情况下使用,反之亦然,那么为什么它们是不同的项目呢?

Eclipse可以处理循环项目依赖关系,但默认情况下,循环依赖关系将被报告为错误,原因很充分(将代码拆分为具有循环依赖关系的项目毫无意义)

您可以将两个项目的循环依赖项项目问题严重性从错误降低为警告,如下所示(不推荐):

  • 项目>属性:Java编译器>构建中
  • 选中复选框启用项目特定设置,然后
  • 在“生成路径问题”部分中,选择“循环依赖项”而不是“错误”

  • 因此,根据@JF Meier的评论,我找到了另一种方法来实现这一点。整个想法基本上是将项目2松散地耦合到项目1,允许项目2与其他实现交换,同时仍然是项目1工作的关键部分

    为了解决循环依赖性问题,我刚刚创建了另一个项目,它将project1project2设置为依赖性,并从那里启动project1。这解决了我的循环依赖性问题,一切正常

    结果是:

    • 项目0:启动程序启动项目1
    • 项目1:核心模块(具有核心实现和API接口)
    • 项目2:辅助模块(服务器)
    以及依赖关系:

    • 项目1——不依赖任何东西

    • 项目2--取决于--->项目1

    • 项目0——取决于--->项目1项目2

    这样,我可以从project0启动project1,同时在类路径上有project2(这样project1可以根据需要找到project2

    我将@howlger的回复标记为已接受,因为它也解决了我的问题。但如果我的问题不能很好地理解,我会在这里说明我最终是如何解决它的,以防它可能对其他人有帮助,他们试图实现和我一样的目标


    谢谢你一如既往的帮助

    我不确定是否可以将Eclipse项目添加为Maven依赖项。Project2单独出现的原因是它是可交换的。在我的例子中,它是一个基于NanoHTTPD的服务器实现,但也包括使用Jetty、Spark或其他任何东西的其他实现。每个都有不同的稳定性和内存占用。这就是为什么在我的例子中允许使用不同的实现是有用的。关于你的第一条评论:我认为你所有的eclipse项目都是用Maven管理的。关于第二条评论:所以Project1实际上并不依赖于Project2,而是依赖于实现某些接口的某个项目(我猜)。因此,Project2与Project1没有运行时依赖关系。相反,有不同的可能组合。如果Project2对Project1有依赖关系,则应该能够启动Project2。Project1可能不需要了解Project2的任何信息。