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)
类似于
但是我确实有两个库的 5.0.0 版本。
关于这个项目https://github.com/FAForever/downlords-faf-client它使用gradle作为构建工具...
我还反编译了安装的程序,发现java声称的方法不存在于jna库中。我觉得这很奇怪。
我还检查没有其他依赖项对 jna 有依赖性。
但最奇怪的是当我 运行 它全部来自 intelij (oracle jdk 10) 但如果我构建安装程序 (openjdk 10在 travis 上)它没有(同一台机器)。
它之前也有效,我们没有更改与 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 旧版本相关,即使您也有当前版本。
你在这里的评论给出了提示:
Probably the discord library I added also contains jna, see log from 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>
因此,您可能处于 Gradle 的依赖项解析选择使用较旧的 jna
的情况,即使您两者都可用,并且您可能有 jna-platform
版本5.0.0 和 jna
版本 4.5.1.
您应该update your build script to force为jna
和jna-platform
使用5.0.0版(或更新版本)。
我想发布应用程序的新版本,但在启动时抛出 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)
类似于
关于这个项目https://github.com/FAForever/downlords-faf-client它使用gradle作为构建工具...
我还反编译了安装的程序,发现java声称的方法不存在于jna库中。我觉得这很奇怪。
我还检查没有其他依赖项对 jna 有依赖性。
但最奇怪的是当我 运行 它全部来自 intelij (oracle jdk 10) 但如果我构建安装程序 (openjdk 10在 travis 上)它没有(同一台机器)。
它之前也有效,我们没有更改与 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 旧版本相关,即使您也有当前版本。
你在这里的评论给出了提示:
Probably the discord library I added also contains jna, see log from 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>
因此,您可能处于 Gradle 的依赖项解析选择使用较旧的 jna
的情况,即使您两者都可用,并且您可能有 jna-platform
版本5.0.0 和 jna
版本 4.5.1.
您应该update your build script to force为jna
和jna-platform
使用5.0.0版(或更新版本)。