【发布时间】:2012-05-28 03:16:02
【问题描述】:
如何使用 Eclipse m2e 引用另一个工作区项目?
我必须在项目设置中添加项目依赖项吗?但在这种情况下,依赖项不会显示在 pom 中。
如果我在 pom 中设置它们,它不会引用工作区中的项目,而是引用本地存储库中的 jar。好烦,有大神帮忙吗?
【问题讨论】:
-
您是否在 Maven 配置中启用了“解决来自工作区项目的依赖项”?
如何使用 Eclipse m2e 引用另一个工作区项目?
我必须在项目设置中添加项目依赖项吗?但在这种情况下,依赖项不会显示在 pom 中。
如果我在 pom 中设置它们,它不会引用工作区中的项目,而是引用本地存储库中的 jar。好烦,有大神帮忙吗?
【问题讨论】:
正确的做法如下:
这应该可以解决您的问题。如果在此之后,您的依赖项仍然从文件系统中引用,请再次检查 groupId、artifactId,尤其是每个依赖项的 version。
同时检查您的项目中是否有任何错误 - 尝试运行 Maven 安装。
【讨论】:
我会走得更远。
如果您曾经在您的项目上运行过mvn eclipse:eclipse,那么您可能遇到了麻烦。我的 eclipse 项目中有一个“Referenced Libraries”部分和一个“Maven Dependencies”部分,库版本冲突,导致 eclipse 和我自己不可避免混乱。
我发现最安全的方法是从命令行运行mvn eclipse:clean,然后返回到 eclipse,刷新项目,“确定”出现问题对话框,然后转到 Maven > 更新项目。这一切都为我解决了。
【讨论】:
当 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
【讨论】:
您还需要确保您的目标是正确的。
如果您不运行 install 目标,那么它将不会被复制到您的存储库并且不会编译。
要了解有关目标的更多信息,请查看https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
【讨论】:
感谢@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>
...
...
<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>
...
Eclipse m2e 将始终查看版本范围并解析来自 eclipse 项目的依赖项(即使您在本地 Maven 存储库中安装了该库,因为 Eclipse 项目将具有更高的版本号),但其他构建器将查看原始的严格版本号。
【讨论】: