着色功能应用程序所需的相同依赖项的多个版本

时间:2016-12-07 17:15:46

标签: java maven dependencies maven-shade-plugin uberjar

我有一个多项目应用程序,我们使用的库oshi取决于JNA的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] 

所以我需要做的是弄清楚如何在uberjar中使用这两个版本。

我已经尝试了relocating 4.3.0版本,但它似乎没有用(这些课程并没有在uberjar的任何地方)。此外,我发誓我今天早些时候读过(但当然现在无法找到),重定位字段中的模式是groupId:artifactId[:type][:classifier],没有版本选项。

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

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

有人可以就如何解决此问题向我提出任何建议吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您正在寻找的是<includes>实施maven-shade-plugin documented here

  

当然,也可以使用<includes>来指定白名单   文物。伪像由形式的复合特征表示   groupId:artifactId[[:type]:classifier]。自插件版本1.3以来   通配符&#39; *&#39;和&#39;?&#39;可以用来做类似水珠的模式   匹配。

     

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

例如

<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>