티스토리 뷰

[JAVA] 외부 library(jar 파일) import 하여 JAVA 프로그램 실행시키기


엄청난 삽질과 결과를 얻었다.. TSTORY 블로그를 전전하며 여러 정보를 얻었지만... 모두 제대로 실행되지 않았고.. 아래와 같은 오류만 발생했다 ㅠ,.ㅠ.... 답은 의외로 간단했다.. Class를 구성할 때 -cp 옵션을 주엇던 것처럼 Java를 실행할때도 역시 -cp 옵션을 주면 된다..(!!환경변수에 외부 library를 추가하지 않았을 경우에)


OS : 

#cat /etc/issue

Ubuntu 16.04.1 LTS \n \l


JAVA 설치 :

#sudo apt-get -y install java


JAVA 버젼 확인 : 

#java -version

java version "1.8.0_111"

Java(TM) SE Runtime Environment (build 1.8.0_111-b14)

Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)


경로 확인 및 Java 디렉토리 확인 : 

guki@guki-desktop:~/program/ConfigBackup$ ll

합계 68K

drwxrwxr-x 3 guki guki 4.0K 12월 13 07:41 ./

drwxrwxr-x 5 guki guki 4.0K 12월 11 18:43 ../

-rwxrwxr-x 1 guki guki  320 12월 12 15:00 Backup.sh*

-rw-rw-r-- 1 guki guki  16K 12월 13 03:00 ConfigBackup.class

-rw-rw-r-- 1 guki guki  22K 12월 12 16:43 ConfigBackup.java

-rw-rw-r-- 1 guki guki  941 12월 13 03:00 CreateDir.class

-rw-rw-r-- 1 guki guki 1.1K 12월 13 03:00 SaveConfig.class

-rw-rw-r-- 1 guki guki  575 12월 13 03:00 TodayDate.class

drwxrwxr-x 2 guki guki 4.0K 12월 11 18:48 lib/


라이브러리 파일 확인 : 

guki@guki-desktop:~/program/ConfigBackup/lib$ ll

합계 308K

drwxrwxr-x 2 guki guki 4.0K 12월 11 18:48 ./

drwxrwxr-x 3 guki guki 4.0K 12월 13 07:41 ../

-rw-rw-r-- 1 guki guki 297K 12월 11 18:41 commons-net-3.5.jar 


보기와 같이 commons-net-3.5.jar 파일을 import 하여 Class를 구성하고 Java를 실행하고자 한다.


Class 파일 구성 : 

#javac -cp ".:/home/guki/program/ConfigBackup/lib/commons-net-3.5.jar" ConfigBackup.java

-cp : class Path를 지정하는 옵션


javac를 사용하였을 시 위에서와 같이 class 파일들이 나타난다!!


Java 실행 : 

#java  ConfigBackup


두둥... 에러 메시지 발생..

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/net/telnet/TelnetClient

        at ConfigBackup.<init>(ConfigBackup.java:168)

        at ConfigBackup.main(ConfigBackup.java:425)

Caused by: java.lang.ClassNotFoundException: org.apache.commons.net.telnet.TelnetClient

        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)


보아하니 TelnetClient library를 찾지 못해 나오는 에러 메시지......OTL....


외부 library 지정하여 JAVA 실행 : 

#java -cp ".:/home/guki/program/ConfigBackup/lib/commons-net-3.5.jar" ConfigBackup


깔끔하게 실행이 잘된다,


+ 추가(feat. 스크립트 생성 및 crontab 지정)

나의 주 목적은 정해진 시간에 Backup 프로그램이 잘 실행되도록 하는것이며 위와 같이 진행할 경우 java파일이 수정될 때마다 저 긴 classpath를 일일이 지정해주고 javac로 class만들고 java를 실행하기가 불편했다.. 따라서 crontab 에 지정해 줄 Backup.sh 스크립트를 만들고 crontab에 등록하니 보다 더 깔끔해졌다,ㅎ


Backup.sh 생성 :

#vi Backup.sh


#!/bin/bash

cd /home/guki/program/ConfigBackup/

#Class 삭제
rm -f /home/guki/program/ConfigBackup/*.class 

#Class 생성
javac -cp ".:/home/guki/program/ConfigBackup/lib/commons-net-3.5.jar" ConfigBackup.java 

#프로그램 실행
java -cp ".:/home/guki/program/ConfigBackup/lib/commons-net-3.5.jar" ConfigBackup

exit 0


Crontab 지정 : 

#crontab -e


# minute (m), hour (h), day of month (dom), month (mon),

# and day of week (dow) or use '*' in these fields (for 'any').#

# Notice that tasks will be started based on the cron's system

# daemon's notion of time and timezones.

#

# Output of the crontab jobs (including errors) is sent through

# email to the user the crontab file belongs to (unless redirected).

#

# For example, you can run a backup of all your user accounts

# at 5 a.m every week with:

# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

#

# For more information see the manual pages of crontab(5) and cron(8)

#

# m h  dom mon dow   command

HOME=/home/guki

PATH=$HOME/.rbenv/shims:$HOME/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


00 3 * * * $HOME/program/ConfigBackup/Backup.sh > /dev/null 2>&1



'Programming > JAVA' 카테고리의 다른 글

[JAVA] Switch Config Backup Program  (0) 2018.08.14
[JAVA] 일회용 패스워드 생성기(OTP Creator)  (0) 2018.08.14
댓글