Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带范围的Maven依赖关系;测试“&;在m2eclipse中启用工作区解析-编译错误仅在Maven构建之后显示_Java_Eclipse_Maven_M2eclipse - Fatal编程技术网

Java 带范围的Maven依赖关系;测试“&;在m2eclipse中启用工作区解析-编译错误仅在Maven构建之后显示

Java 带范围的Maven依赖关系;测试“&;在m2eclipse中启用工作区解析-编译错误仅在Maven构建之后显示,java,eclipse,maven,m2eclipse,Java,Eclipse,Maven,M2eclipse,此问题是回答以下问题的结果: 根据上述问题的答案,我配置了Maven模块的以下结构: 在这种情况下,基本模块中的类Foo可以用于模块A中的测试(例如,当它使用IFoo接口自动连接时),但不能用于生产代码(包含在src/main/java中) 当有人在生产代码(在src/main/java下)中的模块a中的类中添加对Foo类的引用时,Maven构建失败。但是,在这种情况下,Eclipse中的自动构建不会失败,因为我使用了m2eclipse插件,该插件启用了工作区解析。我必须运行maven Bu

此问题是回答以下问题的结果:

根据上述问题的答案,我配置了Maven模块的以下结构:

在这种情况下,基本模块中的类Foo可以用于模块A中的测试(例如,当它使用IFoo接口自动连接时),但不能用于生产代码(包含在src/main/java中)

当有人在生产代码(在src/main/java下)中的模块a中的类中添加对Foo类的引用时,Maven构建失败。但是,在这种情况下,Eclipse中的自动构建不会失败,因为我使用了m2eclipse插件,该插件启用了工作区解析。我必须运行maven Build(mvn clean install)才能看到编译失败。之后,在Eclipse中受影响的类中仍然无法立即看到该错误。我必须在受影响的java类中进行更改(例如,添加一个空格并保存文件),然后才能看到该类中的错误。然而,更具误导性的事实是,Eclipse中显示的编译错误与真正的复制错误无关。-编译错误显示在错误行后的下一行。
我不想在m2eclipse插件中禁用工作区解析,这样最新的源代码总是用于Eclipse的编译。然而,在Eclipse中立即看到这样的编译错误会很好,而不必执行Maven构建来在Eclipse中看到编译错误


在Eclipse编译之后是否可能立即看到编译错误

我不知道为什么在Maven build上会遇到编译错误。请参阅一个演示了多模块Maven设置和模块关系的示例,如上面的文章所示

  • 接口
    -此模块是其他模块依赖的基础,与您文章中的
    基础api
    模块类似。它包含一个名为
    IGreeter
    的单一界面,本质上类似于您文章中的
    IFoo
    界面
  • 实现
    -此模块依赖于
    接口
    ,并包含一个实现
    IGreeter
    的类。它类似于您帖子中的
    base
    模块。注意,这个模块中没有其他代码,甚至没有单元测试
  • 服务
    -这提供了一个虚构的服务层,并依赖于
    接口
    。此外,它还有一个
    测试
    作用域依赖于
    实现
    。它类似于您文章中的模块A。它包含一个名为
    GreetingService
    的类及其关联的集成测试类
    GreetingServiceTest
    。测试可以从命令行或Eclipse运行
  • web
    -这提供了一个虚构的应用程序层,并且依赖于所有其他模块。它使用
    问候服务
    向用户显示问候信息。将其作为mvn clean package tomcat7运行:运行
此示例显示了如何仅依靠某些接口(
service
module)编写业务逻辑。它展示了如何在测试期间选择特定的接口实现,以证明集成是有效的


此示例还显示了如何在运行时选择接口的特定实现(
web
module)。如果您有多个
IGreeter
的实现,并且希望在运行时使用一个特定的实现,那么您可以将其作为依赖项添加到
web
模块中,而不是添加
implementation
模块。

嗨,Manish,我在Github上分析了您的答案和示例项目。我刚才编辑了我的问题,添加了一些细节,因为我想你不明白我之前在问题中的意思。我对您的存储库进行了分叉,并对其进行了一个小改动,以便向您展示我在问题中的意思:[示例]。我在示例服务模块的GreetingService类中的实现模块中添加了对Greeter类的引用。只需取消注释该行并运行maven build即可查看error.PS。我的原始项目是原始问题的基础(简化了)与您在Github的示例项目的结构相同。如果您在服务类中声明实现的变量,则需要该变量的类型在编译时位于作用域中。在这种情况下,您需要从实现到服务的编译时依赖关系。因此,如果您希望在服务类中有一个Greeter实例s、 您需要将服务POM中的实现依赖项的范围从测试更改为编译。我知道。如何删除编译错误不是我的问题,因为我希望看到这种编译错误。任何人都不应该在生产代码(src/main/java)中的示例服务模块中引用实现模块中的类我在这里复制我主要问题的最后一句话:“在Eclipse编译之后,是否有可能立即看到编译错误?”我不能在这里复制我主要问题的全部内容,因此如果你不理解我的意思,请阅读。是的,你的理解是正确的。Maven允许这种分离只是因为它创建了多个类路径,一个用于编译,另一个用于测试,等等。Eclipse作为IDE,每个项目只支持一个类路径。