sysSTD
sysSTD

Reputation: 85

How to resolve the "java.lang.UnsatisfiedLinkError" on Mac terminal?

I have a jar file 'myApp.jar' that I need to run through command line. When I run the jar on linux server it working perfect. However, when I tried to the same jar on mac terminal I am getting this error message:

Exception in thread "main" java.lang.UnsatisfiedLinkError: while loading kognac-core: Stream closed
    at karmaresearch.vlog.VLog.loadLibrary(VLog.java:72)
    at karmaresearch.vlog.VLog.<clinit>(VLog.java:22)
    at org.semanticweb.rulewerk.reasoner.vlog.VLogReasoner.<init>(VLogReasoner.java:82)
    at org.semanticweb.rulewerk.client.picocli.MyApp.someMethod(MyApp.java:150)
    at org.semanticweb.rulewerk.client.picocli.MyApp.main(MyApp.java:110)

The command that I used to run the jar is:

java -jar myApp.java

The jar file is compiled and created by javaSE-1.8 through Eclipse on Mac. The java version of Linux server is openjdk version "1.8.0_292" The java versions on Mac are 3: Java SE 11.0.1(default version) , 1.8.0_202, 1.8.0_201 by these commands:

/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/java -jar myApp.java
/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/bin/java -jar myApp.java

I tried to run the jar file on mac with all 3 java versions, but still getting the same error above.

How could I resolve this error on Mac terminal?

Upvotes: 0

Views: 1372

Answers (1)

rzwitserloot
rzwitserloot

Reputation: 102902

The problem isn't related to your app or how you run it.

Your app uses the karmaresearch project which I'm not familiar with (possibly, that's your own code, that you / your team wrote?) and this code attempts to load a so-called native library: These are libraries compiled straight for the OS/architecture your JVM is running on top of.

These take the form of a .jnilib file on mac, .dll on windows, and .so on linux and other posix-based OSes.

Native libraries are incredibly convoluted to ship: You need 1 such file for each combination of OS and underlying architecture. So, these days, you'd need at a minimum to make a reasonable claim that you're 'portable':

  • Mac AAarch64
  • Mac x84
  • Windows x64
  • Linux AArch64
  • Linux x64
  • Linux x32
  • BSD x64

and that's just a bare bones minimum.

These files cannot be inside the jar when you load them. The usual procedure is to obtain a location you can write to and load code out of (tricky), unpack the right file for the host OS to this folder, and then loadLibrary it. This is all very complicated. In general, either [A] you wrote karmaresearch and you need to think long and hard about using native libraries first, and if you truly need it, follow a tutorial, or [B] it's not your code, in which case you can't run this on a mac, at all, and there's nothing you can do about that, other than contact the makers of this library and ask them to add support for this.

Upvotes: 2

Related Questions