Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vaadin 22.0.1 - UnsatisfiedLinkError on Mac with M1 Max CPU #1308

Closed
skiedrowski opened this issue Dec 14, 2021 · 6 comments
Closed

Vaadin 22.0.1 - UnsatisfiedLinkError on Mac with M1 Max CPU #1308

skiedrowski opened this issue Dec 14, 2021 · 6 comments

Comments

@skiedrowski
Copy link

skiedrowski commented Dec 14, 2021

Running

import org.junit.Test;

import com.vaadin.testbench.TestBenchTestCase;

public class TBTest extends TestBenchTestCase {
    @Test
    public void nix() {}
}

On a M1 Max MacBook Pro with Vaadin 22.0.1 leads an exception indicating that the license checker fails to run on aarm CPUs.
This is a regression. It works with Vaadin 21.0.3.

Exception:

/Users/me/Library/Caches/JNA/temp/jna4388369520872744507.tmp: dlopen(/Users/me/Library/Caches/JNA/temp/jna4388369520872744507.tmp, 0x0001): tried: '/Users/me/Library/Caches/JNA/temp/jna4388369520872744507.tmp' (fat file, but missing compatible architecture (have 'i386,x86_64', need 'arm64e')), '/usr/lib/jna4388369520872744507.tmp' (no such file)
java.lang.UnsatisfiedLinkError: /Users/me/Library/Caches/JNA/temp/jna4388369520872744507.tmp: dlopen(/Users/me/Library/Caches/JNA/temp/jna4388369520872744507.tmp, 0x0001): tried: '/Users/me/Library/Caches/JNA/temp/jna4388369520872744507.tmp' (fat file, but missing compatible architecture (have 'i386,x86_64', need 'arm64e')), '/usr/lib/jna4388369520872744507.tmp' (no such file)
	at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
	at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2442)
	at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2498)
	at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2694)
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2627)
	at java.base/java.lang.Runtime.load0(Runtime.java:768)
	at java.base/java.lang.System.load(System.java:1837)
	at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:1012)
	at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:988)
	at com.sun.jna.Native.<clinit>(Native.java:195)
	at com.sun.jna.platform.mac.IOKit.<clinit>(IOKit.java:51)
	at com.sun.jna.platform.mac.IOKitUtil.<clinit>(IOKitUtil.java:39)
	at oshi.hardware.platform.mac.MacComputerSystem.platformExpert(MacComputerSystem.java:87)
	at oshi.util.Memoizer$1.get(Memoizer.java:87)
	at oshi.hardware.platform.mac.MacComputerSystem.getHardwareUUID(MacComputerSystem.java:69)
	at com.vaadin.pro.licensechecker.MachineId.getComputerId(MachineId.java:23)
	at com.vaadin.pro.licensechecker.MachineId.get(MachineId.java:12)
	at com.vaadin.pro.licensechecker.LicenseChecker.checkLicense(LicenseChecker.java:61)
	at com.vaadin.pro.licensechecker.LicenseChecker.checkLicense(LicenseChecker.java:36)
	at com.vaadin.pro.licensechecker.LicenseChecker.checkLicenseFromStaticBlock(LicenseChecker.java:29)
	at com.vaadin.testbench.TestBenchTestCase.<clinit>(TestBenchTestCase.java:64)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:250)
	at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:260)
	at org.junit.runners.BlockJUnit4ClassRunner$2.runReflectiveCall(BlockJUnit4ClassRunner.java:309)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
	at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:43)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
	at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:82)
	at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:73)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

@Artur-
Copy link
Member

Artur- commented Jan 18, 2022

This most likely happens because your project forces an old version of JNA

@skiedrowski
Copy link
Author

Could you elaborate on that? What is "an old version of JNA"? How do I determine the version used (and why this version is used)?

Why does it work with Vaadin 21.0.3? The error does not appear with Vaadin 21.0.3. The only change required to trigger the error is changing the Vaadin version from 21.0.3 to 22.0.1. The JVM has not been change. I am using 11.0.13-zulu aarm64.

I just created a reproducer based on start.vaadin and was not able to reproduce the error, so it seems to be a problem related to my setup/project. However it would be great if you could give me another hint.

@Artur-
Copy link
Member

Artur- commented Jan 18, 2022

Run mvn dependency:tree and look for jna or something similar for Gradle

@skiedrowski
Copy link
Author

skiedrowski commented Jan 18, 2022

gradlew dependencies found the following provided by vaadin-testbench but no other dependencies with jna in its name

|    +--- com.vaadin:vaadin-testbench:22.0.1
|    |    +--- com.vaadin:vaadin-testbench-core:7.0.3
[...]
|    |    |    +--- com.vaadin:license-checker:1.2.1
|    |    |    |    +--- com.vaadin.external.gwt:gwt-elemental:2.8.2.vaadin2
|    |    |    |    \--- com.github.oshi:oshi-core:5.5.0
|    |    |    |         +--- net.java.dev.jna:jna:5.7.0
|    |    |    |         +--- net.java.dev.jna:jna-platform:5.7.0
|    |    |    |         |    \--- net.java.dev.jna:jna:5.7.0

@skiedrowski
Copy link
Author

The problem vanishes when using JNA version 5.10.0 (latest).

The dependency tree then looks like this

|    |    |    |         +--- net.java.dev.jna:jna:5.7.0 -> 5.10.0
|    |    |    |         +--- net.java.dev.jna:jna-platform:5.7.0
|    |    |    |         |    \--- net.java.dev.jna:jna:5.7.0 -> 5.10.0

(I guess I should also force 5.10.0 on jna-platform.)

@skiedrowski
Copy link
Author

just for the record: moving to jna version 5.10.0 only worked for a week or so. Then the problem reappeared. The real cause was already mentioned by @Artur- : The classpath contains an (older) version of payara-embedded, which repackages net.java.dev.jna:jna amongst other libraries.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants