JEUS 서버에서 JNI 사용 시 발생한 오류에 대해 개인적으로 해결한 방법을 공유합니다.
리눅스에 JEUS를 설치된 상항에서 JNI Native Library so파일을 사용하려고 하는데 문제가 발생했습니다.
1. java.lang.UnsatisfiedLinkError: no xxx in java.library.path
처음 처음 격은 문제는 java.library.path JNI Native Library 경로를 찾지 못해서 발생한 문제이다.
JEUS Admin -> Server -> <Target Server> -> JVM Option
-Djava.library.path= '경로' 를 추가해 줬다.
해당 오류를 발생하지 않았지만.. 다음 2번 오류가 발생했다.
2. 동적 오브젝트 파일을 열 수 없습니다: 그런 파일이나 디렉터리가 없습니다.
처음 해당 오류가 발생하여 경로를 잘못 설정했거나, 권한문제라고 판단했다.
하지만 경로와 권한은 아무런 문제가 없었다.
보통 JNI Native Library를 사용할 때 리눅스에 경우 LD_LIBRARY_PATH 환경변수 설정을 한다.
LD_LIBRARY_PATH 경로 설정은 정상적으로 되어 있는데 왜 경로를 못 찾는 것인지...
JEUS 서버 구동시 LD_LIBRARY_PATH 작성 존재여부를 판단하여 로드시점에 넣어
주고 있음을 알게 되었다.
즉... JEUS서버 구동 후 환경변수에 LD_LIBRARY_PATH 최초로 작성한 경우..
이미 구동된 JEUS에서 PATH가 정상적으로 적용되지 않는 것 같았다.
JEUS 자체를 내렸다가 올리니깐 오류가 해결되고 정상적으로 JNI Native Library 사용하는데 문제가 없었다.
JEUS 구동시 사전에 LD_LIBRARY_PATH 부분이 환경변수에 작성되어 있다면 발생하지 않는 문제인듯 하다.
3. java.lang.UnsatisfiedLinkError: Native Library XXX.so already loaded in another classloader
2번 문제를 해결하고 JNI Native Library so 파일을 사용하여 작업하고 재배포 시 위 오류가 발생했다.
발생원인은 하나의 클래스로더에서 로드되고 나면, 다른 클래스로더에서는 불러올 수 없다는 의미이고
JEUS 위에 구동 중인 서버의 애플리케이션만 재배포하는 경우 발생합니다.
application 배포한 jar, war 경로에 파일만 교체하고
JEUS Admin ->Server -> <Target Server> -> Stop
JEUS Admin ->Server -> <Target Server> -> Start
Target 서버를 내렸다 올려야 서버가 다시 구동되면서 ClassLoader에서 so파일을 정상적으로 로드할 수 있습니다.
Target 서버에서 이미 로드된 후 어플리케이션만 재배포할 경우 이미 로드된 so 파일을 애플리케이션 클래스로더에서
다시 로드하려고 하여 발생한 문제였습니다.
정리하기
1. LD_LIBRARY_PATH 설정 후 JEUS 재구동
- JEUS 설치 및 구동 전이라면 사전에 LD_LIBRARY_PATH 환경변수를 작성하는 것을 추천
2. 애플리케이션 배포 시 Target 서버 재구동
- 어플리케이션 배포 후 배포파일 경로에 파일만 교체하고 Target 서버 재구동하자.
끝으로...
위 내용은 개인적으로 JEUS에서 JNI Native Library 사용 시 격은 문제 및 해결한 방법입니다.
정확한 정보가 아닐 수 있음을 알려드립니다.
JEUS 버전, 서버환경, 설정, 운영체제 다양한 예외가 있을 수 있습니다.
그 점 참고해 주시기 바랍니다.
'dev > Spring Boot' 카테고리의 다른 글
Spring Boot JPA 기초 및 셋팅 (1) | 2023.07.22 |
---|---|
Spring Boot 다국어 Message 사용 (8) | 2023.07.20 |
[오라클]Oracle DB XE 무료버전 설치 및 설치 오류 방법 (2) | 2022.12.06 |
Spring Boot MyBatis 로 MySql 연동하기 Gradle (5) | 2021.08.07 |