yona icon indicating copy to clipboard operation
yona copied to clipboard

aarch64 환경에서는 실행이 안됩니다..

Open gkgk3442 opened this issue 6 years ago • 5 comments

18.09.28

아래와 같은 오류가 나네요,,, 소형 sbc에 최소한의 인원들로 yona를 사용하려고 했는데 sbc 사놓고 사용을 못하고있습니다...;; 혹시 몰라서 libjna-java 를 설치하여도 보았지만 동일한 증상이 일어나네요;; 도와주세요~

ubuntu 18.04 openjre 1.8 mariadb 10.3 libjna-java 4.5.1-1 사용 중입니다.

Exception in thread "main" java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/linux-aarch64/libjnidispatch.so) not found in resource path (... ... at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:776) at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:736) at com.sun.jna.Native.<clinit>(Native.java:131) at org.mariadb.jdbc.internal.util.PidFactory$CLibrary.<clinit>(PidFactory.java:137) at org.mariadb.jdbc.internal.util.PidFactory$1.getPid(PidFactory.java:87) at org.mariadb.jdbc.internal.packet.send.SendHandshakeResponsePacket.writeConnectAttributes(SendHandshake esponsePacket.java:209) at org.mariadb.jdbc.internal.packet.send.SendHandshakeResponsePacket.send(SendHandshakeResponsePacket.jav :195) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authentication(AbstractConnectProtocol.java 535) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProto ol.java:507) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:392) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol java:811) at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:469) at org.mariadb.jdbc.Driver.connect(Driver.java:104) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:351) at com.jolbox.bonecp.BoneCP.<init>(BoneCP.java:416) at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:120) at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:240) at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:238) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.immutable.List.foreach(List.scala:318) at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) at scala.collection.AbstractTraversable.map(Traversable.scala:105) at play.api.db.BoneCPPlugin.onStart(DB.scala:238) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91) at scala.collection.immutable.List.foreach(List.scala:318) at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:91) at play.api.Play$$anonfun$start$1.apply(Play.scala:91) at play.api.Play$$anonfun$start$1.apply(Play.scala:91) at play.utils.Threads$.withContextClassLoader(Threads.scala:21) at play.api.Play$.start(Play.scala:90) at play.core.StaticApplication.<init>(ApplicationProvider.scala:55) at play.core.server.NettyServer$.createServer(NettyServer.scala:253) at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:289) at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:284) at scala.Option.map(Option.scala:145) at play.core.server.NettyServer$.main(NettyServer.scala:284) at play.core.server.NettyServer.main(NettyServer.scala)

================================== 18.09.29

  • /usr/lib/aarch64-linux-gnu/jni/ 안에서 libjnidispatch.so -> libjnidispatch.system.so 와같이 심볼릭 링크 생성해주어도 아래와 같은 오류 생깁니다.
  • 설치된 java/jre/lib/aarch64/ 안에 libjnidispatch.so -> /usr/lib/aarch64-linux-gnu/jni/libjnidispatch.system.so 와 같이 심볼릭 링크 생성해주어도 아래와 같이 오류가 생깁니다.
  • open java -> oracle java 변경 시에도 마찬가지로 아래와 같은 오류가 생깁니다.

Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't obtain static method fromNative(Method, Object) from class com.sun.jna.Native at com.sun.jna.Native.initIDs(Native Method) at com.sun.jna.Native.<clinit>(Native.java:139) at org.mariadb.jdbc.internal.util.PidFactory$CLibrary.<clinit>(PidFactory.java:137) at org.mariadb.jdbc.internal.util.PidFactory$1.getPid(PidFactory.java:87) at org.mariadb.jdbc.internal.packet.send.SendHandshakeResponsePacket.writeConnectAttributes(SendHandshakeResponsePacket.java:209) at org.mariadb.jdbc.internal.packet.send.SendHandshakeResponsePacket.send(SendHandshakeResponsePacket.java:195) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authentication(AbstractConnectProtocol.java:535) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.handleConnectionPhases(AbstractConnectProtocol.java:507) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:392) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:811) at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:469) at org.mariadb.jdbc.Driver.connect(Driver.java:104) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:351) at com.jolbox.bonecp.BoneCP.<init>(BoneCP.java:416) at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:120) at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:240) at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:238) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.immutable.List.foreach(List.scala:318) at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) at scala.collection.AbstractTraversable.map(Traversable.scala:105) at play.api.db.BoneCPPlugin.onStart(DB.scala:238) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91) at scala.collection.immutable.List.foreach(List.scala:318) at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:91) at play.api.Play$$anonfun$start$1.apply(Play.scala:91) at play.api.Play$$anonfun$start$1.apply(Play.scala:91) at play.utils.Threads$.withContextClassLoader(Threads.scala:21) at play.api.Play$.start(Play.scala:90) at play.core.StaticApplication.<init>(ApplicationProvider.scala:55) at play.core.server.NettyServer$.createServer(NettyServer.scala:253) at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:289) at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:284) at scala.Option.map(Option.scala:145) at play.core.server.NettyServer$.main(NettyServer.scala:284) at play.core.server.NettyServer.main(NettyServer.scala)

gkgk3442 avatar Sep 27 '18 17:09 gkgk3442

안녕하세요. 말씀하시는 환경을 만들수가 없어서 오늘 시간난김에 확인을 해봤는데요. 혹시 https://github.com/java-native-access/jna/blob/master/lib/native/android-aarch64.jar 에서 해당 so파일을 받아서 Resource path에 집어넣은 후에 한번 시도해보시겠어요?

sjstyle avatar Oct 16 '18 15:10 sjstyle

so 파일의 링크를 임의로 변경하거나, 파일의 내용을 바꾸거나, jdk의 바이너리 파일을 혼합해서 사용하면 에러를 디버깅하기가 어려워질 수 있을 것 같습니다.

sjstyle avatar Oct 16 '18 15:10 sjstyle

  1. 해당 jar 파일을 링크걸어주고, jar파일 내에있는 so 파일 추출 후 링크 -> 위 결과와 동일하게 라이브러리 찾을 수 없다는 결과를 얻음.
  2. so 파일의 링크를 임의로 변경 -> aarch64 64bit 환경에서 jni so 파일이 없는 것으로 보입니다. 직접 컴파일 하려했지만 실패(소스얻어다가 제 환경에서 컴파일 시 링크 오류 발생...openjre 때문인가 했지만, oracle 적용해도 동일)
  3. jdk의 파이너리 파일을 혼합 -> jdk 혼합이라기보다 alternative 로 자바 버전 openjre, oracle 돌려가며 테스트, 현재는 oracle 지운 상태.
  4. 디버깅이 어려워 질 수 있다. -> 소스 컴파일도 안되는거보면 요나 문제라기보다는 환경 문제 같네요...

몇일 삽질해봐도 안되서 결국 gitea로 갈아타놓고 질문 한 것을 잊고 있었는데, 오늘 답변 달아주셔서 다시 테스트 해보았습니다. 역시 안되네요.. 그래도 이건 환경 문제지 yona 문제가 아니라고 판단됩니다. 저같이 삽질 하는 분들이 없길 바라며.... 개발진님들 힘내세요 ^^; 이번 중국 sbc는 망작인 것으로 판단되니, 다음번에 udoo x86 sbc 구매하게되면 yona 적용해볼께요~ x86인데 설마 안되지는 않겠죠?;;

gkgk3442 avatar Oct 16 '18 16:10 gkgk3442

아 역시 잘 안되는군요 ㅠㅠ 공유 감사합니다. x86 기반의 보드라면 크게 문제가 없을것 같습니다. (OS에서 자바를 설치할 수 있다면요)

sjstyle avatar Oct 17 '18 03:10 sjstyle

aarch64 하드웨어에서 실행을 하니 저도 같은 에러가 났었습니다.

현재 yona 버전에 적용된 play 플랫폼이 aarch64 를 지원하지 않는 거 같습니다. 수동으로 arm64 를 지원하는 버전을 classpath 에 추가하는 방법으로 문제를 해결 했습니다.

심도있는 분석은 못했고, 파일 변경에 따른 문제가 생길 가능성이 있긴 합니다만 동작가능한 방법은 찾았기에 공유합니다. (몇달동안 수십 명이 사용하였지만 아직은 아무런 문제가 없었습니다.)

-1. 우분투 18.04.3 aarch64 장비용 입니다.

# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic # uname -a Linux yona-server 4.15.0-72-generic #81-Ubuntu SMP Tue Nov 26 12:21:09 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux

0. 요나 바이너리 릴리즈를 다운 받아 압축을 풀어놓은 환경입니다.

( mariadb 는 10.4.10 으로 설치 및 권장 설정 작업을 미리 다 해놓은 상황 입니다. ) $ unzip yona-v1.12.0-bin.zip $ cd yona-1.12.0 $ bin/yona

1. jna 최신 버전을 다운받아 lib 디렉토리에 복사합니다.

아래 URL 에서 https://github.com/java-native-access/jna

jna-5.5.0.jar 파일을 받아서 lib 디렉토리에 넣어줍니다. (http://repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar)

$ cd lib $ wget http://repo1.maven.org/maven2/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar $ cd ..

2. bin/yona 파일에서 app_classpath 에 jna-5.5.0.jar 를 추가합니다.

$ vi bin/yona 기존 360번째 줄 : declare -r app_classpath="$lib_dir/yona.yona-1.12.0.jar:~~이하생략 변경 : declare -r app_classpath="$lib_dir/jna-5.5.0.jar:$lib_dir/yona.yona-1.12.0.jar:~~이하생략

3. 필요한경우 DB 계정 정보를 업데이트 합니다.

$ vi conf/application.conf

4. yona를 실행시켜 줍니다.

$ bin/yona

아래와 같이 잘 동작 합니다. vraptor@yona-server:/storage1/yona-1.12.0$ bin/yona Play server process ID is 4984 [info] play - database [default] connected at jdbc:mysql://127.0.0.1:3306/yona [info] application - === Yona server starting initialization === [info] application - --- Config reading: ok! - 134 ms [info] application - --- Property reading: ok! - 0 ms [info] application - --- Pull request checking: ok! - 15 ms [info] play - Starting application default Akka system. [info] application - --- Notification mail scheduler: ok! - 248 ms [info] application - --- Notification event cleanup scheduler: ok! - 1 ms [info] application - --- Temporary files cleanup scheduler: ok! - 37 ms [info] application - --- Basic access controller config reading: ok! - 3 ms [debug] application - Registered AuthProvider 'google' [debug] application - Registered AuthProvider 'github' [info] play - Application started (Prod) [info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

감사합니다.

autowiz avatar May 21 '20 10:05 autowiz