簡體   English   中英

jna平台中的NoSuchMethodError

[英]NoSuchMethodError in jna-platform

我想發布該應用程序的新版本,但啟動時會引發NoSuchMethodError

java.lang.NoSuchMethodError: com.sun.jna.Native.load(Ljava/lang/String;Ljava/lang/Class;Ljava/util/Map;)Lcom/sun/jna/Library;
    at com.sun.jna.platform.win32.Shell32.<clinit>(Shell32.java:45)
    at com.sun.jna.platform.win32.Shell32Util.getFolderPath(Shell32Util.java:54)
    at com.sun.jna.platform.win32.Shell32Util.getFolderPath(Shell32Util.java:71)
    at com.faforever.client.preferences.PreferencesService.<clinit>(PreferencesService.java:78)
    at com.faforever.client.FafClientApplication.main(FafClientApplication.java:55)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:85)
    at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94)
    at com.install4j.runtime.launcher.WinLauncher.main(WinLauncher.java:25)

類似於使用JNA User32平台圖的NoSuchMethodError。但是我確實有兩個庫的版本5.0.0。

關於這個項目https://github.com/FAForever/downlords-faf-client它使用gradle作為構建工具...

另外,我反編譯了已安裝的程序,並發現jna庫中沒有java聲明的方法。 我覺得這很奇怪。

我也檢查沒有其他依賴項對jna有依賴性。

但是,最奇怪的是,當我從intelij(oracle jdk 10)運行所有程序時,它可以工作,但是如果我構建安裝程序(travis上的openjdk 10),則不會(同一台機器)。

之前它也起作用,並且我們沒有更改與jna相關的代碼或庫版本的任何內容。 travis使用的openjdk版本可能有所更改,但是我看不到它是如何關聯的。

是否有人知道可能會導致這種情況的...。

這是失敗的實際代碼:

Paths.get(Shell32Util.getFolderPath(ShlObj.CSIDL_COMMON_APPDATA), "FAForever")

即使我想這也不是問題...

這是jvm日志https://drive.google.com/file/d/11RpxvFubYM7vCoAE-Kx_6EkIKADPQofE/view?usp=sharing

其中可能是重要的部分:

[3.689s][debug][class,resolve               ] com.sun.jna.Native java.lang.Object (super)
[3.689s][debug][class,resolve               ] com.sun.jna.Native com.sun.jna.Version (interface)
[3.689s][debug][class,resolve               ] com.sun.jna.platform.win32.Shell32 com.sun.jna.Native Shell32.java:45 (explicit)
[3.689s][debug][protectiondomain            ] Checking package access
[3.689s][debug][protectiondomain            ] class loader: a 'jdk/internal/loader/ClassLoaders$AppClassLoader'{0x00000000ee70de08} protection domain: a 'java/security/ProtectionDomain'{0x00000000ef103908} loading: 'com/sun/jna/Native'
[3.689s][debug][protectiondomain            ] granted
[3.689s][trace][protectiondomain            ] pd set count = #1
[3.689s][debug][class,resolve               ] com.sun.jna.platform.win32.Shell32 com.sun.jna.Native Shell32.java:45
[3.689s][info ][stacktrace                  ] java.lang.NoSuchMethodError, 12
[3.689s][info ][exceptions                  ] Exception <a 'java/lang/NoSuchMethodError'{0x00000000ef00dd70}: com.sun.jna.Native.load(Ljava/lang/String;Ljava/lang/Class;Ljava/util/Map;)Lcom/sun/jna/Library;> (0x00000000ef00dd70) 
thrown [t:/workspace/open/src/hotspot/share/interpreter/linkResolver.cpp, line 741]
for thread 0x00000000031a5000

我添加的discord庫可能還包含jna,請參閱jvm的日志:

[3.689s][info ][class,load                  ] com.sun.jna.Native source: file:/E:/DownlordClient%20RC/Downlord's%20FAF%20Client/lib/discord-rpc-1.6.2.jar

與JNA相關的NoSuchMethodError幾乎總是與在您的依賴項列表中某處擁有較舊版本的JNA有關,即使您也具有當前版本。

您在這里的評論給出了提示:

我添加的discord庫可能也包含jna,請參閱jvm的日志

查看該庫的POM,我們看到:

<name>DiscordRPC</name>
<version>1.6.2</version>
...
<dependencies>
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>4.5.1</version>
        <scope>compile</scope>
    </dependency>
    ...
</dependencies>

所以,你很可能會在搖籃的解決依賴已經選擇使用舊的情況jna即使你有兩個可用,您可能有jna-platform版本5.0.0和jna 4.5.1版。

您應該更新構建腳本,以強制jnajna-platform使用版本5.0.0(或更新的版本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM