由于 JDT 依赖项,Maven 构建失败 - 没有适用于 org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0) 的版本

Ric*_*k.X 44 java eclipse maven

今天,当我尝试安装我的 Maven 项目时,由于 JDT 依赖项而出现错误,以下是报告信息:

Cannot resolve No versions available for org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0) within specified range.
[ERROR] Failed to execute goal on project redundantcheck: 
Could not resolve dependencies for project edu.fudan.selab:redundantcheck:jar:1.0-SNAPSHOT: 
Failed to collect dependencies at org.eclipse.jdt:org.eclipse.jdt.core:jar:3.20.0 -> 
org.eclipse.platform:org.eclipse.core.resources:jar:3.12.0 -> 
org.eclipse.platform:org.eclipse.core.expressions:jar:3.5.100 -> 
org.eclipse.platform:org.eclipse.core.runtime:jar:3.12.0 -> 
org.eclipse.platform:org.eclipse.equinox.preferences:jar:3.10.0 -> 
org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0): No versions available for 
org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0) within specified range -> [Help 1]
Run Code Online (Sandbox Code Playgroud)

我尝试将1.1.0 org.osgi.service:org.osgi.service.prefs添加到项目中,但仍然无法解决这个问题。为了避免依赖项更新,我指定了几乎每个版本的依赖项,但今天仍然遇到此错误。这是我的 pom.xml:

Cannot resolve No versions available for org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0) within specified range.
[ERROR] Failed to execute goal on project redundantcheck: 
Could not resolve dependencies for project edu.fudan.selab:redundantcheck:jar:1.0-SNAPSHOT: 
Failed to collect dependencies at org.eclipse.jdt:org.eclipse.jdt.core:jar:3.20.0 -> 
org.eclipse.platform:org.eclipse.core.resources:jar:3.12.0 -> 
org.eclipse.platform:org.eclipse.core.expressions:jar:3.5.100 -> 
org.eclipse.platform:org.eclipse.core.runtime:jar:3.12.0 -> 
org.eclipse.platform:org.eclipse.equinox.preferences:jar:3.10.0 -> 
org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0): No versions available for 
org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0) within specified range -> [Help 1]
Run Code Online (Sandbox Code Playgroud)

有办法解决这个问题吗?

Jmi*_*ini 25

编辑:项目团队已知该问题,并在 GitHub 上跟踪为eclipse-equinox/equinox.bundles#54

依赖关系:

<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.equinox.preferences</artifactId>
<version>3.10.0</version>
Run Code Online (Sandbox Code Playgroud)

这是您的传递依赖项之一,在其依赖项列表中引用此依赖项:

<dependency>
    <groupId>org.osgi.service</groupId>
    <artifactId>org.osgi.service.prefs</artifactId>
    <version>[1.1.0,1.2.0)</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

来源:Maven Central 上的org.eclipse.equinox.preferences-3.10.0.pom 。

这是一个错误。正如 Maven 告诉你的,这并不存在:

无法解决org.osgi.service:org.osgi.service.prefs:jar:[1.1.0,1.2.0)指定范围内没有可用的版本。

本来应该是:

<dependency>
    <groupId>org.osgi</groupId>
    <artifactId>org.osgi.service.prefs</artifactId>
    <version>[1.1.0,1.2.0)</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

其中存在(注意不同groupId)。

因为您没有修复项目中使用的依赖项,并且因为依赖项正在使用版本范围,所以突然您得到了一个新版本。

顺便说一句,正如beingnurd所指出的,现在有较新的版本3.10.1修复org.eclipse.equinox.preferences 了这个错误的依赖关系(请参阅参考资料org.eclipse.equinox.preferences-3.10.1.pom)。

如果您继续始终使用兼容范围的最新依赖项,问题将为您解决。


现在,如果我们退一步:

您正在尝试使用以下 JDT 版本:

<dependency>
    <groupId>org.eclipse.jdt</groupId>
    <artifactId>org.eclipse.jdt.core</artifactId>
    <version>3.20.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这对应于 Eclipse 版本2019-124.14内部也称为)。


您的问题是 Eclipse 项目(org.eclipse.jdt.core以及所有依赖项)正在使用版本范围。如果您查看org.eclipse.jdt.core依赖项声明:

  • org.eclipse.platform:org.eclipse.core.resources:[3.12.0,4.0.0)
  • org.eclipse.platform:org.eclipse.core.runtime:[3.13.0,4.0.0)
  • org.eclipse.platform:org.eclipse.core.filesystem:[1.7.0,2.0.0)
  • org.eclipse.platform:org.eclipse.text:[3.6.0,4.0.0)

如果你什么都不做,Maven 总是采用最新的:

今天(2022 年 6 月)将是:

  • org.eclipse.core.resources3.16.100
  • org.eclipse.core.runtime3.24.100
  • org.eclipse.core.filesystem1.9.300
  • org.eclipse.text3.12.0

该库发布时(2019 年 12 月)是:

  • org.eclipse.core.resources3.13.600
  • org.eclipse.core.runtime3.17.0
  • org.eclipse.core.filesystem1.7.600
  • org.eclipse.text3.10.0

当然,这是递归的,您需要对所有依赖项执行此操作。


让 Maven 选择总是最新的是有问题的:

  • 它会阻止您创建可重复的构建,因为 Maven 选择的依赖项取决于当天 Maven Central 上可用的依赖项。
  • 你需要解决冲突。
  • 您可能是第一个尝试组合的人。

这就是为什么我总是使用一组一起发布的项目。顺便说一句,这也是 Eclipse 项目本身的做法(通过使用 P2 更新站点和目标平台)。

我正在发布 Maven BOM 文件来修复版本:ECentral 项目


您可以这样做:

  <repositories>
    <repository>
      <id>ecentral</id>
      <url>https://raw.githubusercontent.com/jmini/ecentral/HEAD/repo</url>
    </repository>
  </repositories>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>fr.jmini.ecentral</groupId>
        <artifactId>eclipse-platform-dependencies</artifactId>
        <version>4.14</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.eclipse.jdt</groupId>
      <artifactId>org.eclipse.jdt.core</artifactId>
      <!-- no version needed here, because it is defined in the BOM -->
    </dependency>
  </dependencies>
Run Code Online (Sandbox Code Playgroud)


Sas*_*cha 12

因为我今天也遇到了这个问题,但是通过插件子依赖,我的临时解决方案是下载常规org.osgi:org.osgi.service.prefs:jar:1.1.2并将其安装在本地存储库中作为org.osgi.service:org.osgi.service.prefs:jar:1.1.2.


小智 8

您可以像这样排除依赖关系:

<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.24.0</version>
<exclusions>
    <exclusion>
        <groupId>org.osgi.service</groupId>
        <artifactId>org.osgi.service.prefs</artifactId>
    </exclusion>
</exclusions>
Run Code Online (Sandbox Code Playgroud)


kun*_*arg 5

所以这个失败的原因是依赖 <groupId>org.osgi.service</groupId> <artifactId>org.osgi.service.prefs</artifactId>

但 org.osgi.service 组不存在,而它只是 org.osgi 所以依赖关系应该看起来

<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.prefs</artifactId>
Run Code Online (Sandbox Code Playgroud)