【问题标题】:Eclipse doesn't see classes from Maven modules in workspaceEclipse 在工作区中看不到来自 Maven 模块的类
【发布时间】:2015-12-01 20:28:14
【问题描述】:

我们有一些 Maven 模块在多个团队之间共享,即使我们的项目使用不同的依赖项和资源,我们也有权共享源代码。为此,我们按照Using Maven When You Can't Use the Conventions 中“从单一源目录生成多个唯一 JAR”下的建议设置了我们的模块。具体来说,我们有一个包含 src 目录的共享父模块,但其 pom 声明 <packaging>pom</packaging> 并且只构建两个子模块。每个子模块都继承自这个父模块,并使用这个来引用共享的 src 目录:

<build>
    <sourceDirectory>../src/main/java</sourceDirectory>
</build>

两个子模块有不同的工件ID,允许依赖的模块和项目指定他们需要的版本和依赖集。它也秉承了“一个模块,一个输出”的Maven原则。

这一切在 Maven 领域都很好用:编译、安装、部署等。不能很好地工作的是 Eclipse 集成。有些事情工作正常:构建模块,部署到我们的 Maven 存储库,拉入依赖项来构建我们的项目。但是诸如代码完成和跳转到类/方法定义之类的东西根本不起作用。就好像 Eclipse 根本无法识别源代码一样。

如果我们只是从 SVN 中检出一个模块,Eclipse 不知道这些类,而是使用来自 repo 的 jar。如果我们随后将模块作为 Maven 模块导入,它们会显示在包资源管理器和项目构建路径中。但是,所有对这些类和方法的引用现在都被 Eclipse 标记为错误。而且我们仍然没有代码完成或导航。

所以我的问题是:我们如何让 Eclipse 识别代码并进行正常的代码导航,同时仍然满足我们不断变化的项目需求?我是否缺少一些简单的 Eclipse 配置?我们是否需要重新设计我们的 Maven 模块结构,如果需要,怎么做?

一些额外的上下文:项目的不同依赖关系相当大,包括 Weblogic 和 Spring 等不同的主要版本。 Weblogic 版本将在明年某个时候收敛,但其他依赖项会更慢(并且某些资源文件可能始终保持不同)。因此,对于近期到中期的未来,我们必须考虑项目之间的不同依赖关系。

我们正在使用配置文件来允许我们的 Jenkins 服务器构建两个子模块,同时允许单个开发人员仅构建他们项目需要的子模块。使用配置文件来管理依赖是有问题的,因为我们失去了依赖的传递性。

更新(2015 年 12 月 8 日)

我最终能够通过在“配置构建路径...”对话框中使用“链接源...”让 Eclipse 识别源目录。添加源文件夹不会让我引用模块的父目录,但链接源让我分配一个任意目录来使用。这并不理想,但似乎可以正常工作。

【问题讨论】:

  • 我猜你也读过这部分:“Maven 开发人员强烈建议你把它作为最后的手段”。我猜 M2Eclipse 在这样的项目结构上遇到了麻烦。除了将其更新到最新版本之外,我认为您无能为力,当然,除了回到正常的默认项目结构。
  • 是的,这是作为最后手段使用的,希望其缺点是可以容忍的。考虑到不同的依赖关系,有没有办法使用默认结构?我考虑过单独的 pom 文件制作单独的工件,但我的理解是 Eclipse 只会关注 pom.xml;其中一个项目将被冷落。
  • 老实说,我不知道......我担心你会在这个问题上感到孤独。
  • 如果你喜欢在 jar 级别共享代码,这意味着只需使用依赖项。 Maven是基于共享依赖而不是共享源代码的思想......强制共享源代码没有意义,也没有优势等。相反,它有缺点......如果你喜欢使用像Eclipse这样的工具您应该遵循 Maven 中的约定...
  • 鉴于我们有需要为单独的环境(Weblogic 10 和 12)构建的模块,包括必须为正确的应用服务器编译和打包的 EJB,我希望有一个临时解决方案,直到我们的环境趋于一致。当前结构似乎违反的唯一约定是 src 目录比通常的目录高一级,Maven 似乎很乐意使用它。只有 Eclipse 不合作。我希望有一种方法可以管理这些单独的构建环境,这样 Maven 和 Eclipse 都会很愉快。

标签: eclipse maven m2e


【解决方案1】:

我最终能够通过在“配置构建路径...”对话框中使用“链接源...”让 Eclipse 识别源目录。添加源文件夹不会让我引用模块的父目录,这让我有一段时间出轨了。但是,Link Source 让我可以分配一个任意目录来使用。

这并不理想,但它似乎正在工作。我们现在可以使用 F3 跳转到定义,并且错误现在可以正确突出显示。这已经足够好了,我不会觉得不好推荐给其他团队。我希望 Eclipse 会自动允许引用父源目录,但至少手动干预是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2012-08-16
    • 2015-07-28
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多