[Issues] Linux Java(FX) JDK Install

👻·2022년 3월 3일
0

Issues

목록 보기
3/4
post-thumbnail

📌개요

Window 환경에서 JavaFX로 개발 및 사용중이던 프로그램을
Linux CentOS7 환경에서 실행해야 했다.

기존 프로그램은 exe 파일 형태로 만들어져있고,
리눅스 환경에서는 jar 형태로 실행되야 한다.

exe 형태의 실행파일은 jre 경로를 지정해 줄 수 있기 때문에
java가 설치되지 않은 환경이나, 버전이 다르다던가 그런 문제가 발생하지 않도록
jre를 포함시켜서 실행할 수 있게한다.
하지만 jar 형태가 되면 기본적으로 실행 환경에서 jdk가 설치되어 있어야한다.

당연히 실행되야하지만,
현재 테스트용 리눅스 서버는 최소설치된 텍스트 모드로 되있었고
여러가지 해결해야 할 사항이 많았다..

일단 GUI 환경으로 설정을 세팅하고 실행해보았지만
"메인 클래스를 찾거나 로드할 수 없다"는 오류 메시지만 단촐하게 나왔다..

실행 시 생기는 문제중 가장 짜증나는 오류다.
메인 클래스를 찾지 못하는 경우 또는 로드할 수 없는 경우 크게 두가지지만
그 경우에 대한 사항들이 너무 많아서 해결하는데 오래 걸렸다.

메인 클래스를 찾지 못하는 이유는 아닌 것으로 판단했고,
로드할 수 없는 이유를 찾아야 했다.

JavaFX를 사용하지 않은 프로그램들은 정상적으로 실행됬다.
(평소에도 미들웨어 등 리눅스에서 실행하던 것들은 많았다.)

하지만 JavaFX를 사용해서 만든 프로그램은 실행되지 않았고
이유를 찾는데 하루가 걸렸다.

Linux CentOS7을 처음 설치 시 JDK는 기본으로 제공된다.
기본 제공되는 jdk에는 JavaFX를 실행할 수 있는 라이브러리가 제공되지 않는다.
따라서 JavaFX 라이브러리를 포함한 JDK를 따로 받아서 옮긴 후 경로 설정을 해야했다.

JDK를 새로 넘겨준 후 실행하니 아주 잘 된다.


📌개발환경

  • Linux CentOS 7
  • Java 8 (included JavaFX)

📌해결방안

📃 jdk 확인

CentOS를 설치 한 초기 상태에서 jdk는 기본으로 설치되어 있다.

CentOS에서 yum list 명령어를 통해 설치 가능한 jdk 버전을 알 수 있다.

[root@localhost ~]# yum list java*jdk-devel
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
 * base: mirror.kakao.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
Available Packages
java-1.6.0-openjdk-devel.x86_64              1:1.6.0.41-1.13.13.1.el7_3               base
java-1.7.0-openjdk-devel.x86_64              1:1.7.0.171-2.6.13.0.el7_4               updates
java-1.8.0-openjdk-devel.i686                1:1.8.0.161-0.b14.el7_4                  updates
java-1.8.0-openjdk-devel.x86_64              1:1.8.0.161-0.b14.el7_4                  updates
[root@localhost ~]#

여기 있는 jdk들은 JavaFX를 호환하지 않는 jdk들이다.

그 말은 yum 명령어로 설치하는 jdk들은 현재 쓸모가 없다는 말이다.
오라클에서 jdk를 따로 가져오자..

📃 jdk 설치

JavaFX를 사용할 수 있는 Java 8 jdk를 다운로드 한다.
오라클에서 받을 수 있다.

https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html

나의 경우 Linux x64 환경이므로 그에 맞는 tar.gz를 받았다.


(받은 jdk 안에 javafx-src.zip 뭐 이런게 보이면 FX를 사용할 수 있는 jdk다.)

centOS에 다운받은 tar.gz를 넘겨준다.

centOS의 원하는 경로에 압축을 해제해준다.
아래 명령어를 사용하면 tar.gz 형태의 압축을 해제할 수 있다.

tar -zxvf [파일명.tar.gz]

압축을 풀었다면 현재 설치된 java 버전을 확인해보자.

[root@localhost ~]# java -version
java 1.8.0_161
[root@localhost ~]# javac -version
javac 1.8.0_161

javac 위치도 확인해보자

[root@localhost ~]# which javac
/usr/bin/javac
[root@localhost ~]# readlink -f /usr/bin/javac
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/bin/javac
[root@localhost ~]#

두 경로의 차이점은 심볼릭 링크와 원본 파일의 위치 차이다.
궁금하면 검색해보자. 난 알고 싶지 않다..

1.8.0_161 버전이 설치 및 경로설정이 되어있다.
이제 새로 가져온 jdk 경로로 변경해주어야 한다.

📃 jdk 경로 설정

리눅스에서 Java 환경변수를 등록해주려면
profile이라는 파일을 수정해야한다.
vi 명령어를 통해 수정하자.

혹시나 모를까봐..
vi로 파일을 연 후 i키를 눌러야 편집이 가능하며,
수정 후 :wq 입력을 통해 저장 및 종료를 할 수 있다.

vi /etc/proifile

명령어를 통해 편집기를 열고, 맨 마지막 부분에 export JAVA_HOME을 추가해준다.

export JAVA_HOME=[다운로드 받은 변경할 jdk 경로]

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_202/

나의 경우 /usr/lib/jvm/jdk1.8.0_202에 압축을 해제했으므로
위와같이 경로를 지정해주었다.

수정 후 저장한 뒤 변경사항을 적용해야한다.
ssh를 재접속 해도 되지만 아래 명령어를 수행하면 바로 적용된다.

source /etc/profile

이제 적용이 제대로 됬는지 확인해보자.

[root@localhost ~]# echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_202/
[root@localhost ~]# $JAVA_HOME/bin/javac -version
javac 1.8.0_202

적용이 잘 되었다.

jar을 실행했다.

실행되지 않았다..😂

에코 말고 -version 명령어로 다시 확인해보자.

[root@localhost ~]# java -version
java 1.8.0_161
[root@localhost ~]# javac -version
javac 1.8.0_161

경로를 변경했지만 적용되있지 않았다..

📃 jdk 변경

리눅스에서 기존의 jdk를 삭제하지 않고 변경하려면
경로 설정뿐만 아니라 jdk를 지정해주어야 한다.

일단 현재 사용가능한 java 버전을 확인해보자

[root@localhost /]# alternatives --config java

3 개의 프로그램이 'java'를 제공합니다.

  선택    명령
-----------------------------------------------
   1           java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/bin/java)
*+  2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java)

추가했던 jdk가 보이지 않는다..
alternatives --install 명령어를 통해 추가할 수 있다.

[root@localhost /]# alternatives --install /usr/bin/java java [jdk경로/bin/java] [우선순위]

[root@localhost /]# alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_202/bin/java 1

추가 후 다시 alternatives --config java 명령어로 확인해보자

[root@localhost /]# alternatives --config java

3 개의 프로그램이 'java'를 제공합니다.

  선택    명령
-----------------------------------------------
   1           java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/bin/java)
*  2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java)
 + 3           /usr/lib/jvm/jdk1.8.0_202/bin/java

현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오:

3번 항목을 보면 제대로 추가된 것을 확인할 수 있다.
번호를 입력하여 3번으로 변경해주자.

이제 다시 version을 확인해보자.

[root@localhost ~]# java -version
java 1.8.0_202
[root@localhost ~]# javac -version
javac 1.8.0_202

드디어 정상적으로 Java 경로를 변경했다 ㅠㅠ

적용이 잘 되었다.

jar을 실행했다.

실행이 아주 아주 잘된다!!! 해결 완료!!!


📌 결론

"메인 클래스를 찾을 수 없거나 로드할 수 없습니다." 라는 문구에서
메인 클래스를 찾을 수 없는 상태에 포커싱을 두고 해결하려다 보니
시간낭비가 꽤 많았다.

기존 jar들을 실행해왔었으니까
메인 클래스를 찾을 수 없는 문제는 아니라는 것을 빨리 캐치해야했다.

JavaFX는 메인 클래스에서 Application를 상속받아서
start() 메소드를 오버라이드 하여 launch()메소드로 메인 함수를 호출한다.
그래서 실행하자마자 메인 클래스를 로드할 수 없다고 했던 것이다.
단순한 문제였지만 여전히 나는 부족하다😂

profile
Software Developer

0개의 댓글