2

我有一个多项目应用程序,我们使用一个库oshi,它取决于JNA的 4.2.2 版本。在我们的项目本身中,我们使用尚未发布的 4.3.0。我们做出的贡献将在 4.3.0 发布时发布,但我们现在需要它,因此我们目前使用自己构建的分叉版本。

我们使用 maven 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] 

所以我需要做的是弄清楚如何在 uberjar 中同时拥有这两个版本。

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

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

myproject
+-oshi-core
|   +- jna 4.2.2
+-jna 4.3.0-CUSTOM

任何人都可以就如何解决这个问题给我任何建议吗?谢谢!

4

1 回答 1

0

您正在寻找的可能是此处记录<includes>的 maven-shade-plugin 的实现

当然,<includes>也可以用来指定工件的白名单。人工制品由形式的复合标识符表示 groupId:artifactId[[:type]:classifier]。从插件版本 1.3 开始,通配符 '*' 和 '?' 可用于进行类似 glob 的模式匹配。

对于包含来自选定依赖项的哪些类的细粒度控制,可以使用工件过滤器:

例如

<configuration>
     <filters>
         <filter>
            <artifact>com.github.dblock:oshi-core</artifact>
            <includes>
                <include><!--some package you want to include here--></include>
            </includes>
         </filter>
         <filter>
            <artifact>net.java.dev.jna:jna</artifact>
            <includes>
                <include><!--the package from 4.2.0 you want to keep--></include>
            </includes>
          </filter>
      </filters>
</configuration>
于 2016-12-07T19:55:05.387 回答