NoSuchMethodError в jna-платформе - PullRequest
1 голос
/ 04 мая 2019

Я хочу сделать новую версию приложения, но при запуске оно выдает 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)

аналогично NoSuchMethodError с использованием карты платформы JNA User32 Однако у меня есть версия 5.0.0 обеих библиотек.

Речь идет об этом проекте https://github.com/FAForever/downlords-faf-client он использует gradle в качестве инструмента для сборки ...

Также я декомпилировал установленную программу и обнаружил метод, который, как утверждает java, отсутствует в jna libary. Что я нахожу супер странным.

Также я проверяю, что никакая другая зависимость не имеет зависимости от jna.

Но самое странное, что это работает, когда я запускаю все это из intelij (oracle jdk 10), но тогда, если я собираю установщик (openjdk 10 на travis), это не так (на той же машине).

Также это работало раньше, и мы ничего не изменили ни в коде, связанном с jna, ни в версии библиотеки. Возможно, изменилась версия openjdk, которую использует travis, но я не понимаю, как это будет связано.

У кого-нибудь есть идея, что может вызвать это ...

Это фактический код, который не работает:

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

Вероятно, добавленная мной библиотека диссонанса также содержит jna, см. Log от 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

1 Ответ

2 голосов
/ 04 мая 2019

NoSuchMethodError, относящаяся к JNA, почти всегда связано с наличием более старой версии JNA в вашем списке зависимостей, даже если у вас также есть текущая версия.

Ваш комментарий дает подсказку:

Вероятно, добавленная мной библиотека разногласий также содержит jna, см. Log от 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.

Вам следует обновить скрипт сборки, чтобы заставить использовать версию 5.0.0 (или более новую) для jna и jna-platform.

...