Java 着色显示运行应用程序所需的相同依赖项的多个版本

Java 着色显示运行应用程序所需的相同依赖项的多个版本,java,maven,dependencies,maven-shade-plugin,uberjar,Java,Maven,Dependencies,Maven Shade Plugin,Uberjar,我有一个多项目应用程序,其中我们使用一个库,这取决于的版本4.2.2。 在我们的项目中,我们使用4.3.0,它还没有发布。当4.3.0发布时,我们做出了贡献,但我们现在需要它,所以我们目前使用我们自己构建的分叉版本 我们使用maven shade插件将所有内容打包。目前,shade插件在uberjar中使用4.3.0 问题是oshi在4.2.2中使用了一个似乎在4.3.0中没有的函数。我们正在使用的接口已更改,现在我们得到NoSuchMethodError异常。我们得到的例外情况如下所示: or

我有一个多项目应用程序,其中我们使用一个库,这取决于的版本4.2.2。 在我们的项目中,我们使用4.3.0,它还没有发布。当4.3.0发布时,我们做出了贡献,但我们现在需要它,所以我们目前使用我们自己构建的分叉版本

我们使用maven shade插件将所有内容打包。目前,shade插件在uberjar中使用4.3.0

问题是oshi在4.2.2中使用了一个似乎在4.3.0中没有的函数。我们正在使用的接口已更改,现在我们得到NoSuchMethodError异常。我们得到的例外情况如下所示:

org.quartz.JobExecutionException: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NoSuchMethodError: com.sun.jna.platform.win32.OleAuto.VariantClear(Lcom/sun/jna/Pointer;)Lcom/sun/jna/platform/win32/WinNT$HRESULT;]
at org.quartz.core.JobRunShell.run(JobRunShell.java:218) [quartz-2.2.3.jar:?] 
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.3.jar:?]

Caused by: org.quartz.SchedulerException: Job threw an unhandled exception.
at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-2.2.3.jar:?]
... 1 more
Caused by: java.lang.NoSuchMethodError: com.sun.jna.platform.win32.OleAuto.VariantClear(Lcom/sun/jna/Pointer;)Lcom/sun/jna/platform/win32/WinNT$HRESULT;
at oshi.util.platform.windows.WmiUtil.enumerateProperties(WmiUtil.java:504) ~[oshi-core-3.2.jar:3.2]
at oshi.util.platform.windows.WmiUtil.queryWMI(WmiUtil.java:304) ~[oshi-core-3.2.jar:3.2]
at oshi.util.platform.windows.WmiUtil.selectUint32sFrom(WmiUtil.java:112) ~[oshi-core-3.2.jar:3.2]
at oshi.hardware.platform.windows.WindowsGlobalMemory.updateSwap(WindowsGlobalMemory.java:74) ~[oshi-core-3.2.jar:3.2]
at oshi.hardware.common.AbstractGlobalMemory.getSwapTotal(AbstractGlobalMemory.java:82) ~[oshi-core-3.2.jar:3.2] 
myproject
+-oshi-core
|   +- jna 4.2.2
+-jna 4.3.0-CUSTOM
所以我需要做的是找出如何在uberjar中同时使用这两个版本

我尝试过4.3.0版本,但似乎不起作用(uberjar中没有任何类)。此外,我发誓我今天早些时候读到(但现在当然找不到)重新定位字段中的模式是
groupId:artifactId[:type][:classifier]
,没有版本选项

我的依赖关系树的相关部分如下所示:

org.quartz.JobExecutionException: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NoSuchMethodError: com.sun.jna.platform.win32.OleAuto.VariantClear(Lcom/sun/jna/Pointer;)Lcom/sun/jna/platform/win32/WinNT$HRESULT;]
at org.quartz.core.JobRunShell.run(JobRunShell.java:218) [quartz-2.2.3.jar:?] 
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.3.jar:?]

Caused by: org.quartz.SchedulerException: Job threw an unhandled exception.
at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-2.2.3.jar:?]
... 1 more
Caused by: java.lang.NoSuchMethodError: com.sun.jna.platform.win32.OleAuto.VariantClear(Lcom/sun/jna/Pointer;)Lcom/sun/jna/platform/win32/WinNT$HRESULT;
at oshi.util.platform.windows.WmiUtil.enumerateProperties(WmiUtil.java:504) ~[oshi-core-3.2.jar:3.2]
at oshi.util.platform.windows.WmiUtil.queryWMI(WmiUtil.java:304) ~[oshi-core-3.2.jar:3.2]
at oshi.util.platform.windows.WmiUtil.selectUint32sFrom(WmiUtil.java:112) ~[oshi-core-3.2.jar:3.2]
at oshi.hardware.platform.windows.WindowsGlobalMemory.updateSwap(WindowsGlobalMemory.java:74) ~[oshi-core-3.2.jar:3.2]
at oshi.hardware.common.AbstractGlobalMemory.getSwapTotal(AbstractGlobalMemory.java:82) ~[oshi-core-3.2.jar:3.2] 
myproject
+-oshi-core
|   +- jna 4.2.2
+-jna 4.3.0-CUSTOM
有人能给我一些建议来解决这个问题吗?
谢谢

您正在寻找的可能是maven shade插件的实现

当然,
也可以用来指定 人工制品工件由形式的复合标识符表示
groupId:artifactId[[:type]:分类器]
。从插件版本1.3开始 通配符“*”和“?”可用于生成类全局模式 匹配

用于从选定的 如果包含依赖项,则可以使用工件过滤器:

e、 g


dblock:oshicore
net.java.dev.jna:jna

重新定位是指将jar从一个模块移动到另一个模块吗?或者这到底意味着什么?另外,您是否可以与
oshi
和定制
JNA
分享您最终在pom中得到的最小依赖关系。我更新了问题的答案。如果这两个实现相互冲突,在这种情况下,您为什么要同时使用这两个依赖项呢?oshi也使用了4.2.2中的一个函数,它似乎不在4.3.0中(不知道为什么)…这是一个自定义构建,对吗?我们最终做的是分叉oshi,给它一个新版本,并让oshi依赖于我们的jna工件。然后我们参考我们的Oshi定制版本。从维护的角度来看,这是一个麻烦,但它让我们工作起来。至少我们有自己的nexus repo。问题不在于包含依赖项,而是uberjar中的依赖项类文件存储在一个目录中。/net/java/dev/jna/。由于无法指定版本,并且类文件具有相同的名称,因此以最后写入的为准。无论其价值如何,打破一切的变化似乎就在这里: