2016-12-07 63 views
1

我有一個多項目應用程序,我們使用一個庫,oshi,依賴於版本4.2.2的JNA。 在我們的項目本身,我們使用4.3.0,它還沒有發佈。我們在4.3.0版本發佈時做出了貢獻,但我們現在需要它,所以我們目前使用我們自己構建的分叉版本。底紋功能應用程序所需的相同依賴項的多個版本

我們使用maven遮罩插件打包所有東西。目前,陰影插件在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 

誰能給我如何解決這個有什麼建議? 謝謝!

+0

通過重新定位你的意思從一個模塊移動所述罐到另一個?或者這到底意味着什麼?你也可以分享你最終在你的pom中使用'oshi'和定製'JNA'的最小依賴關係。 – nullpointer

+0

我在回覆中更新了問題。 –

+0

如果這兩個實現相互衝突,爲什麼要在這種情況下使用這兩個依賴項? – nullpointer

回答

0

你所尋找的可能是<includes>執行maven的遮陽簾插件作爲documented here

當然,<includes>可以作爲很好的指定 文物白名單。僞影由形式爲的組合標識符表示。由於插件版本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> 
+0

問題不在於包括依賴關係,而是uberjar中的依賴類文件存儲在./net/java/dev/jna/目錄中。由於沒有辦法指定版本,並且類文件具有相同的名稱,無論哪個寫入最後獲勝。 爲了什麼它的價值,打破一切的變化似乎是在這裏: https://github.com/java-native-access/jna/commit/61bd36b0d05d18008377cd9d011be0c794f86296 –

相關問題