【发布时间】: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 都会很愉快。