【问题标题】:Maven dependency with scope "test" & Workspace Resolution enabled in m2eclipse - compile error shown only after the Maven build在 m2eclipse 中启用范围“测试”和工作区分辨率的 Maven 依赖项 - 仅在 Maven 构建后显示编译错误
【发布时间】:2014-02-14 01:57:39
【问题描述】:

此问题是对以下问题的回答的结果: Injection of an autowired field failed in a multi-module Maven project - NoSuchBeanDefinitionException

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

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

当有人在生产代码(在 src/main/java 下)的模块 A 中的类中添加对 Foo 类的引用时,Maven 构建失败。但是,在这种情况下,Eclipse 中的自动构建不会失败,因为我使用了启用了 Workspace Resolution 的 m2eclipse 插件。我必须运行 maven build (mvn clean install) 才能看到编译失败。之后,在 Eclipse 中受影响的类中仍然不能立即看到该错误。我必须在受影响的 java 类中进行更改(例如,添加空格并保存文件),然后我可以在此类中看到错误。然而,更令人误解的是,Eclipse 中显示的编译错误与真正的编译错误无关。 - 编译错误显示在错误行之后的下一行。
我不想禁用 m2eclipse 插件中的 Workspace Resolution,以便始终使用最新的源代码进行 Eclipse 的编译。但是,最好在 Eclipse 中立即看到这样的编译错误,而不必为了在 Eclipse 中看到编译错误而执行 Maven 构建。

是否可以在 Eclipse 编译后立即看到编译错误?

【问题讨论】:

    标签: java eclipse maven m2eclipse


    【解决方案1】:

    我不确定您为什么在 Maven 构建中遇到编译错误。请参阅 sample project on Github,它演示了一个多模块 Maven 设置,其模块关系如您上面的帖子所示。

    • interface - 此模块是所有其他模块所依赖的基础,类似于您帖子中的 base-api 模块。它包含一个名为IGreeter 的接口,本质上类似于您帖子中的IFoo 接口;
    • implementation - 此模块依赖于interface,并包含一个实现IGreeter 的类Greeter。它类似于您帖子中的base 模块。请注意,此模块中没有其他代码,甚至没有单元测试;
    • service - 这提供了一个虚构的服务层并依赖于interface。此外,它对implementation 具有test 范围依赖。它类似于您帖子中的module A。它包含一个名为GreetingService 的类及其关联的集成测试类GreetingServiceTest。测试可以从命令行运行,也可以从 Eclipse 运行;
    • web - 这提供了一个虚构的应用程序层并依赖于所有其他模块。它使用GreetingService 向用户显示问候消息。以mvn clean package tomcat7:run 运行它。

    此示例展示了如何仅依赖某些接口(@98​​7654342@ 模块)来编写业务逻辑。它展示了如何在测试期间选择特定的接口实现以证明集成有效。

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

    【讨论】:

    • 嗨 Manish,我在 Github 上分析了您的答案和示例项目。不久前我通过添加一些细节来编辑我的问题,因为我想你不明白我之前在我的问题中的意思。我分叉了您的存储库并对其进行了一些小改动,以便向您展示我在问题中的意思:[github.com/krzysztof-michalski/maven-multi-module](forked 示例)。我在 sample-service 模块的 GreetingService 类中添加了对 Greeter 类的引用。只需取消注释该行并运行 maven build 即可查看错误。
    • 附言。作为原始问题基础的原始项目与您在 Github 上的示例项目具有(简化)相同的结构。
    • 好吧,如果你在 Service 类中声明了一个实现的变量,你将需要该变量的类型在编译时在作用域内。在这种情况下,您需要从实现到服务的编译时依赖关系。因此,如果您希望在您的 Service 类中有一个 Greeter 实例,您需要将服务 POM 中实现依赖的范围从测试更改为编译。
    • 我知道。如何消除编译错误不是我的问题,因为我想看到这样的编译错误。任何人都不应在 sample-service 模块的生产代码 (src/main/java) 中的 sample-service 模块中的 implementation 模块中引用一个类。我在这里复制我的主要问题的最后一句话:“是否有可能在 Eclipse 编译后立即看到编译错误?”我无法在此处复制我的主要问题的全文,因此,如果您不明白我的意思,请阅读。
    • 是的,你的理解是正确的。 Maven 允许这种分离仅仅是因为它创建了多个类路径,一个用于编译,另一个用于测试,等等。 Eclipse 作为 IDE,每个项目只支持一个类路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2011-02-09
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多