目录
现象
在pom引入org.eclipse.jdt.core的情况下
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
</dependency>
项目启动报错,找不到org.eclipse.core.runtime.Plugin
打包也报错
Failed to execute goal on project xxx: Could not resolve dependencies for project xxx:
Failed to collect dependencies at
org.eclipse.jdt:org.eclipse.jdt.core:jar:3.19.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]
问题分析
从打包报错中可以看到其实是找不到org.osgi.service:org.osgi.service.prefs这个包,那就从依赖先找一找
依赖分析
org.eclipse.jdt.core包内部采用的是范围依赖
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.resources</artifactId>
<version>[3.12.0,4.0.0)</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.runtime</artifactId>
<version>[3.13.0,4.0.0)</version>
</dependency>
这样写好处是可以每次拉到最新的包,比方说现在最新的是
但是也有坑:
这种写法会拉取范围内所有包,当其中某一个包出问题后,就会直接终止拉取,换言之,除非你从maven中心删除这个包,否则就会一直出错,这也是这次出问题之后没法及时补救的原因。
包分析
既然知道了为什么以前没问题,这次出问题的原因,那就针对打包的报错找一下,看看org.osgi.service:org.osgi.service.prefs这个包为什么找不到。
去maven上一搜,好家伙,原来这个包的groupid是org.osgi。。。
问题总结
这么重要的问题不可能没人讨论,去github issue上一看,果然截止17号已经67个讨论,基本都是在说项目忽然不能用了,求解决
https://github.com/eclipse-equinox/equinox.bundles/issues/54
其实问题就是出在范围依赖上,在6.14号org.eclipse.equinox.preferences发布了新版本3.10.0,里面就包含这次的错误,错误的将org.osgi的groupid写成了org.osgi.service,而eclipse.jdt的所有引入都是采用范围引入,不管你项目本身定义了什么版本,都会在打包时拉取这次的错误版本,导致了这次大规模的项目失败。
PS:官方在6.15号更新了3.10.1版本,修复了这次错误,但是基于上文说的坑,并没什么用,3.10.0存在的情况下就会直接报错。
所以理论上来说,只要项目用到了eclipse.jdt.core相关的,就会出现这次的问题。
解决方式
1、引入国外制作的BOM定义,锁死依赖
<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>
2、仓库新增
既然你写错了org.osgi.service,那我就按照你的错建一个,在本地maven仓库按照错误的新建一个一样的目录,把包拖进去
3、排除错误依赖
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<exclusions>
<exclusion>
<groupId>org.osgi.service</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>