在 Eclipse m2e 中,如何引用工作空间项目?

Posted

技术标签:

【中文标题】在 Eclipse m2e 中,如何引用工作空间项目?【英文标题】:In Eclipse m2e, how to reference workspace project? 【发布时间】:2012-05-28 03:16:02 【问题描述】:

如何使用 Eclipse m2e 引用另一个工作区项目?

我必须在项目设置中添加项目依赖项吗?但在这种情况下,依赖项不会显示在 pom 中。

如果我在 pom 中设置它们,它不会引用工作区中的项目,而是引用本地存储库中的 jar。好烦,有大神帮忙吗?

【问题讨论】:

您是否在 Maven 配置中启用了“解决来自工作区项目的依赖项”? 【参考方案1】:

正确的做法如下:

仅使用 POM 文件中的依赖项部分,不要摆弄 Eclipse 项目引用。右键单击项目,然后选择 Maven > 更新项目配置 将项目重置为 Maven 默认设置。这样,m2e 拥有依赖项的所有权。 确保所有引用的项目都在 Eclipse 中打开并启用了 Maven nature。 检查每个项目的 Maven 设置,确保 groupIdartifactIdversion 与您在 Eclipse 中打开的项目匹配。因此,如果您依赖的项目在 Eclipse 中具有版本 1.0.0-SNAPSHOT,请确保依赖项目的 POM 文件在 中引用版本 1.0.0-SNAPSHOT >依赖项部分。 为每个项目启用Workspace Resolution。右键单击项目,然后 Maven > 启用工作区解析。 最后,如果项目仍然没有解决,再次右键单击项目,然后Maven > 更新项目

这应该可以解决您的问题。如果在此之后,您的依赖项仍然从文件系统中引用,请再次检查 groupIdartifactId,尤其是每个依赖项的 version

同时检查您的项目中是否有任何错误 - 尝试运行 Maven 安装。

【讨论】:

这对我有帮助,但是引用的项目被部署为普通文件夹而不是 jar 文件,有没有办法改变这个?非常感谢提前 我需要相反的解决方案(希望本地 repo 中的 jar 优先于项目引用)并且通过禁用“工作区解析”功能,我能够完成它!感谢您指向正确方向的指针... 听起来很傻,但除了第 2 点之外 “确保所有引用的项目都在 Eclipse 中打开并启用了 Maven 特性”确保所有引用的项目都是最新的。如果工作区解析工作正常,则依赖项在 Maven POM 编辑器中显示为 Eclipse 项目文件夹图标而不是 jar 图标。 还有其他想法吗? - 所有项目都是开放的,并且启用了 Maven 自然。 - groupId、artifactId 和版本都匹配。 - 为所有项目启用工作区分辨率。 - Maven > 更新项目没有帮助。 Maven 安装工作,这是我可以在依赖项目中显示更改的唯一方法。奇怪的是,我有另一组项目 exactly 具有相同的设置,并且这些项目都能正确解决。 Maven 依赖项指向 Eclipse 中的项目,而不是存储库中的 JAR。但不适用于我目前的项目。 根据我自己的评论,问题是大小写不匹配。这些项目的名称大小写不一。工件 ID 应该都是小写的,但我也让它们混合大小写。这破坏了 Eclipse 中的工作区解析,但由于某种原因,它没有来自我的本地存储库。我更正了大小写不匹配,现在工作区解析工作正常。【参考方案2】:

我会走得更远。 如果您曾经在您的项目上运行过mvn eclipse:eclipse,那么您可能遇到了麻烦。我的 eclipse 项目中有一个“Referenced Libraries”部分和一个“Maven Dependencies”部分,库版本冲突,导致 eclipse 和我自己不可避免混乱。

我发现最安全的方法是从命令行运行mvn eclipse:clean,然后返回到 eclipse,刷新项目,“确定”出现问题对话框,然后转到 Maven > 更新项目。这一切都为我解决了。

【讨论】:

【参考方案3】:

当 eclipse 搞砸了导入和删除多个项目时,您可能需要重建 maven 存储库的索引。这是我做过的一种方式。

    检查引用的项目是否被eclipse正确识别为maven项目。

    在菜单栏中,单击Window -> Show View -> Other... 当弹出“显示视图”窗口时,选择Maven -> Maven Repositories 在 Maven Repositories 窗口中,您应该在 Local Repositories -> Workspace Projects 中看到您的项目作为 jar 文件 如果您在Workspace Projects 中找不到您的项目,请右键单击Workspace Projects 并选择Rebuild Index

    更新引用项目的 maven

    右键点击引用项目Maven -> Update Project... -> OK

【讨论】:

【参考方案4】:

您还需要确保您的目标是正确的。

如果您不运行 install 目标,那么它将不会被复制到您的存储库并且不会编译。

要了解有关目标的更多信息,请查看https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

【讨论】:

OP 是关于从 Eclipse 工作区解决依赖关系,而不是本地存储库 - 或者更准确地说:如何在不安装本地工作区的情况下解决依赖关系。【参考方案5】:

感谢@nwinkler 的回复,主要问题是版本号匹配。

一个常见的情况是,如果您正在开发一组彼此版本锁定的项目 - 例如,一个项目和一组库项目的耦合不是很松散,这样一个库 API 可能相关应用项目版本使用的版本发生变化,但可能会以与应用项目的过去或未来版本不兼容的方式发生变化。

在这种配置中设置 Maven 依赖项的正确方法(也是推荐的做法)是让应用使用特定版本的库 - 例如,如果您重建旧版本的应用,它将使用之前编译时使用的库版本。

将应用项目的 POM 库依赖项设置为发布版本(假设为 1.0.0),并且在处理下一个版本时将应用和库项目设置为 SNAPSHOT 版本(假设为2.0.0-SNAPSHOT), m2e 将无法正确解析库版本,并且可能会下载旧版本,因此尝试使用诸如“Open Decleration”之类的 Eclipse 功能将针对下载 jar(有时甚至没有源附件),这可能很烦人。

解决此问题的一种方法是将应用 POM 依赖项版本设置为一个范围,因此您将依赖于 [1.0.0-),而不是依赖于 1.0.0。有了这样的开放范围,m2e 会很高兴地找到您的工作区库项目。但是您希望在提交、构建和发布之前将其设置回“正确”的版本 - 这很容易出错。

我的解决方案是使用构建配置文件并为 m2e 设置自定义配置文件,如下所示:

使用属性将依赖项版本设置为要发布的版本:
...

<properties>
<my.library.version>1.0.0</my.library.version>
</properties>

<dependencies>
  <dependency>
    <groupId>my.group</groupId>
    <artifactId>my.library</artifactId>
    <version>$my.library.version</version>
  </dependency>
</dependencies>

...
然后添加一个配置文件部分,其中包含一个默认情况下不执行任何操作的活动配置文件,以及一个覆盖具有范围的库版本属性的 Eclipse 特定配置文件:
...

<profiles>
    <profile>
        <id>default</id>
        <activation><activeByDefault></activeByDefault></activation>
    </profile>
    
    <profile>
        <id>eclipse</id>
        <properties>
            <my.library.version>[1,)</my.library.version>
        </properties>
    </profile>
</profiles>

...
最后转到您的项目属性,在“Maven”下将“eclipse”键入“Active Maven Profiles”:

然后“应用并关闭”。

Eclipse m2e 将始终查看版本范围并解析来自 eclipse 项目的依赖项(即使您在本地 Maven 存储库中安装了该库,因为 Eclipse 项目将具有更高的版本号),但其他构建器将查看原始的严格版本号。

【讨论】:

不错@Guss!只是想补充一下,您实际上并不需要默认的空活动配置文件,并且有一种方法可以使用 m2e 属性创建一个 Eclipse 感知配置文件来激活它:m2e.version激活>。这种方式有点清洁恕我直言。谢了。

以上是关于在 Eclipse m2e 中,如何引用工作空间项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse Indigo 中禁用 m2e 构建?

如何在 Eclipse 中启用索引下载以进行 Maven 依赖项搜索? [复制]

什么是 org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER 以及如何使它在 IntelliJ 中工作?

命令行上的 Maven 依赖项更新

摆脱 org.eclipse.m2e:lifecycle-mapping 的 POM not found 警告

如何映射 Eclipse m2e 插件未涵盖的 Maven 生命周期阶段?