为什么Eclipse将maven运行时依赖项转换为编译依赖项?

时间:2017-11-25 23:04:49

标签: eclipse maven m2eclipse

我有一个导入Eclipse Oxygen的maven项目。 Eclipse报告没有编译问题(Alt + F5)。当我从命令行运行maven时,我得到了

[ERROR] /home/dean/src/TAP3UIs/TAP3Desktop/src/main/java/com/ms/tap3/controller/RequestAccessController.java:[8,30] package com.google.common.base does not exist

该软件包确实存在于我的.ava / 15.0.jar中的.m2 / repository中。我也可以在Eclipse mvn依赖项中看到它。当我检查项目的mvn dependency:tree时,我看到了

[INFO] | | | +- com.google.guava:guava:jar:15.0:runtime

它是命令行上的运行时传递依赖项,它解释了为什么它不能在命令行上编译。不知何故,Eclipse已经转变了从运行时到编译的传递依赖。

有谁知道为什么会这样,以及我如何使Eclispe m2e尊重传递依赖的范围?

2 个答案:

答案 0 :(得分:1)

目前,see top rated reply here whyJDT都不支持每个项目支持不同范围所需的多个类路径。

请参阅:m2e

答案 1 :(得分:1)

重点是:如果在源代码中导入外部类,则必须将它们设置为编译依赖项,并且永远不要相信它们可能已经的事实是传递依赖(因为,因为它们是传递性的,你没有直接控制它们,因此在未来的版本中它们也可能会消失)。

这是怎么回事:

  • 您需要com.google.common.base软件包中的某些类,因此您需要将com.google.guava:guava:jar:15.0设置为依赖项。
  • 相反,你没有,因为你意识到它已经是一个传递依赖,但你错过了运行时依赖的事实。
  • Eclipse M2不区分不同的Maven标准类路径,因此它将所有依赖关系视为" compile"范围。因此Eclipse在编译中包含guava-15.0.jar,项目编译正常。
  • Maven反而在编译阶段不会包含运行时依赖项,因此会引发编译错误。

简而言之:您应该将guava-15.0(以及您的代码需要的任何其他工件)包含在直接依赖(带有编译范围)中pom文件。