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

35

如何在Eclipse的m2e插件中引用另一个工作区项目?

我是否需要在项目设置中添加项目依赖项? 但是在这种情况下,依赖关系不会显示在pom文件中。

如果我将它们设置在pom文件中,它将不会引用工作区中的项目,而是引用本地仓库中的jar包。这非常烦人,有没有人可以帮忙?


2
你在Maven配置中启用了“从工作区项目解析依赖项”吗? - Thomas
5个回答

62
正确的操作步骤如下:
  • 只使用POM文件中的dependencies部分,不要去调整Eclipse项目的引用。右键单击项目,选择 Maven > Update Project Configuration 将项目重置为Maven默认设置。这样,m2e就拥有了依赖项的所有权。
  • 确保在Eclipse中打开并启用了Maven nature的所有引用项目。
  • 检查每个项目的Maven设置,确保groupIdartifactIdversion与您在Eclipse中打开的项目匹配。因此,如果您所依赖的项目在Eclipse中的版本是1.0.0-SNAPSHOT,请确保依赖项目的POM文件在dependencies部分引用了版本号为1.0.0-SNAPSHOT的版本。
  • 为每个项目启用Workspace Resolution。右键单击项目,然后选择Maven > Enable Workspace Resolution
  • 最后,如果仍无法解决问题,请再次右键单击项目,然后选择Maven > Update Project

这应该能解决您的问题。如果在执行上述步骤之后,您的依赖项仍然是从文件系统中引用的,请再次检查每个依赖项的groupIdartifactId和尤其是version

还要检查您的项目是否有任何错误-尝试运行Maven install。


2
这对我有帮助,但是参考的项目部署为普通文件夹而不是jar文件,有没有改变这种情况的方法?非常感谢。 - Khinsu
1
我需要相反的解决方案(希望本地存储库中的jar文件优先于项目引用),通过禁用“工作区分辨率”功能,我成功完成了它!感谢您指出正确的方向... - Matthias Steiner
除了第二点“确保在Eclipse中打开并启用Maven nature的所有引用项目”之外,还要确保所有引用的项目都是最新的。如果工作区分辨率正常工作,则依赖项将显示为Eclipse项目文件夹图标,而不是Maven POM编辑器中的jar图标。 - andy
还有其他的想法吗?
  • 所有项目都是开放的,并启用了Maven nature。
  • groupId,artifactId和version都匹配。
  • 对于所有项目启用工作区分辨率。
  • Maven>更新项目没有帮助。
Maven安装可行,这是我能够使依赖项目中的更改显示出来的唯一方法。奇怪的是,我有另一组具有完全相同设置的项目,这些项目可以正确解析。 Maven依赖项指向Eclipse中的项目,而不是存储库中的JAR。 但对于我的当前项目却不是这样。
- lukpac
2
继续我的评论,问题是大小写不匹配。这些项目的名称是混合大小写的。构件ID应该全部小写,但我也将它们变成了混合大小写。这破坏了Eclipse中的工作区解析,但出于某种原因,它并没有从我的本地存储库中破坏。我纠正了大小写不匹配,现在工作区解析正常工作。 - lukpac
显示剩余3条评论

8
我认为需要更进一步。 如果你曾经在项目中运行过mvn eclipse:eclipse,那么你可能会遇到麻烦。我曾经遇到这样一种情况,我的eclipse项目中有一个“Referenced Libraries”部分和一个“Maven Dependencies”部分,它们的库版本发生了冲突,导致eclipse和我自己都感到困惑。
我发现最安全的方法是从命令行中运行mvn eclipse:clean,然后重新进入eclipse,刷新项目,“OK”出现的问题对话框,然后进行Maven > Update Project。这样就可以解决所有问题。

6
当使用Eclipse导入和删除多个项目时,您可能需要重建Maven存储库的索引。以下是我使用的方法。
1.检查Eclipse是否正确地将所引用的项目识别为Maven项目。 在菜单栏中,点击“Window -> Show View -> Other...” 当“Show View”窗口弹出时,选择“Maven -> Maven Repositories” 在Maven Repositories窗口中,您应该看到您的项目作为jar文件出现在“Local Repositories -> Workspace Projects”中 如果您无法在“Workspace Projects”中找到您的项目,则右键单击“Workspace Projects”,然后选择“Rebuild Index”
2.更新引用项目的Maven 右键单击引用项目,“Maven -> Update Project... - > OK”

1
感谢@nwinkler的回答,主要问题是匹配版本号。
常见情况是,如果您正在开发一组与彼此版本锁定的项目 - 例如,一个项目和一组紧密耦合的库项目,这样库API可能会在要由相关应用程序项目版本消耗的版本中更改,但可能以与过去或未来版本的应用程序项目不兼容的方式更改。
在这种配置下设置Maven依赖项的正确方法(也是推荐的做法)是使应用程序使用特定版本的库 - 因此,例如,如果您重新构建旧版本的应用程序,则它将使用先前编译的库版本。
随着应用程序项目的POM库依赖关系设置为发布版本(假设为1.0.0),并且在同时使用应用程序和库项目设置为SNAPSHOT版本的下一个版本时(假设为2.0.0-SNAPSHOT),m2e将无法正确解析库版本,并且很可能会下载旧版本,因此尝试使用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”:

enter image description here

  • 然后点击"应用并关闭"。

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


1
很好的发现@Guss!只是想补充一下,你实际上不需要一个默认的空活动配置文件,有一种方法可以使用m2e属性创建一个eclipse感知的配置文件来激活它:<activation><property><name>m2e.version</name></property></activation>。在我看来,这种方式更加清晰。谢谢。 - Reginaldo Santos

1

本帖讨论的是如何从Eclipse工作区解决依赖项,而不是本地存储库 - 更准确地说:如何在本地工作区中解决依赖关系而无需安装它们。 - Guss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接