首页 > 解决方案 > 加载资源时,什么决定了 Maven 依赖项的行为?

问题描述

我有一个 Eclipse Maven 项目,它依赖于我工作区中的其他项目。我已经将它们全部定义为从我的本地存储库中导入,并且 pom.xml 中的依赖语句看起来都是一致的,例如:

<dependency>
  <groupId>com.mycompany.mygroup</groupId>
  <artifactId>Project1</artifactId>
  <version>1.0.2</version>
</dependency>

<dependency>
  <groupId>com.mycompany.mygroup</groupId>
  <artifactId>Project2</artifactId>
  <version>2.0.1</version>
</dependency>

但是,一些项目出现在我的构建路径中是二进制 jar 文件,带有此图标:二进制图标,而其他项目则带有我认为的“工作区项目”图标:项目图标

当我尝试加载 JAR 文件中包含的资源时,这会成为一个问题:带有“二进制 jar”图标的项目从 JAR 中成功加载资源;带有“工作区项目”图标的项目尝试转到文件系统以获取资源。

是什么决定了它们在 Maven 依赖项列表中的显示方式?我检查了.project文件中的“自然”标签,它们是相同的。

标签: javaeclipsemaven

解决方案


此行为由Maven --> Disable/Enable Workspace Resolution具有以下行为的选项控制(

这具有改变 Maven 定位依赖项工件的方式的效果。如果项目配置为从工作区解析依赖项,则这些工件不需要存在于本地存储库中。假设 project-a 和 project-b 都在同一个 Eclipse 工作区中,并且 project-a 依赖于 project-b。如果禁用工作区解析,则仅当本地存储库中存在 project-b 的工件时,项目-a 的 m2eclipse Maven 构建才会成功。如果启用了工作区解析,m2eclipse 将通过 Eclipse 工作区解析依赖关系。换句话说,当启用工作空间解析时,项目不必安装在本地存储库中以相互关联。

这意味着如果Workspace Resolution禁用,则必须从 maven 存储库中读取所有依赖项,并将显示为在此处输入图像描述.

另一方面,如果Workspace Resolution启用并且您的工作区包含一个开放项目,其所有工件信息(groupId, artifactId, version)与 中定义的相同<dependency>,则该依赖项将直接引用此开放项目的源代码。图标将显示为在此处输入图像描述

我不认为这可能是唯一的因素,因为一些带有“二进制 jar”图标的依赖项也在我的工作区中打开。

我认为很可能是因为<version>您在 中使用的与工作区中该项目pom.xml的声明不同。<version>


推荐阅读