2014년 3월 11일 화요일

Java - CLASSPATH 환경 정보(오류및 설정)

# Java 컴파일및 실행시 classpath 환경 설정 중요.

# classpath 현재위치( . ) 실행 테스트
옵션 : -cp 와 -classpath 동일

[app@sunshiny classes]$ java -cp . TestMain
[app@sunshiny classes]$ java -classpath . TestMain

# Java 컴파일시 오류
# Java 컴파일시에 import 하는 클래스 파일을 찾지 못하는 증상
TestMain.java:9: error: package kr.sunshiny.util.security does not exist
import kr.sunshiny.util.security.SecurityMgr;


# -sourcepath 옵션에 클래스(classes) 파일의 시작위치를 지정해줌(javac 옵션 정보 확인)
javac -classpath $CLASS_PATH -sourcepath /usr/local/app/classes kr/sunshiny/test/TestMain.java

# Java 실행시 오류

오류: 기본 클래스 TestMain(를) 찾거나 로드할 수 없습니다.

# 필요 라이브러리를 사용자 클래스 패스에 설정을 해놓아도 Java 실행시 클래스파일을 찾지 못하는 증상
[app@sunshiny classes]$ java TestMain
또는
[app@sunshiny classes]$ java -classpath . TestMain
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/common/Common
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
        at java.lang.Class.getMethod0(Class.java:2685)
        at java.lang.Class.getMethod(Class.java:1620)
        at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.apache.common.Common
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 6 more


jar 파일위치 지정 또 사용자 프로파일에 설정해둔 환경의 CLASS_PATH 를 명시해줌.
[app@sunshiny classes]$ java -classpath $CLASS_PATH TestMain

- 컴파일 후 해당 위치에서 클래스 파일을 실행할때 이름을 찾지 못하는 증상
[app@sunshiny test]$ java -classpath $CLASS_PATH TestMain
Exception in thread "main" java.lang.NoClassDefFoundError: kr/sunshiny/test/TestMain (wrong name: TestMain)

        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)


# 클래스파일 패키지(classes) 시작 위치로 이동을 한후에 해당 클래스파일을 실행
[app@sunshiny classes]$ java -classpath $CLASS_PATH kr/sunshiny/test/TestMain


# 사용자 프로파일 설정 예
[app@sunshiny classes]$ vi ~/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

### Java Env
export JAVA_HOME=/usr/local/java/jdk1.7.0_10

### Test Env
export TEST_APP_HOME=/usr/local/app
export TEST_APP_CORE=$TEST_APP_HOME/lib/test_app-core.jar
export MYSQL_DRIVER=$TEST_APP_HOME/lib/mysql-connector-java-5.0.7-bin.jar
예1) export CLASS_PATH=.:$TEST_APP_CORE:$MYSQL_DRIVER:$JAVA_HOME/lib
예2) export CLASS_PATH=/home/webapps/classes/.:$TEST_APP_CORE:$MYSQL_DRIVER:$JAVA_HOME/lib

# 예1) 어느 위치에서나 현재위치에서부터 클래스 파일을 실행하도록 명시하는 부분( . )
# 예2) 어느 위치에서나 특정 디렉토리의 classes 에서부터 클래스 파일을 실행하고자 할때.
          (스케줄 등록, 스크립트 내에서 활용)

PATH=$PATH:$HOME/bin:$CLASS_PATH:$JAVA_HOME/bin

export PATH


# Java 옵션 정보
[search@sunshiny classes]$ javac
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files and annotation processors
  -cp <path>                 Specify where to find user class files and annotation processors
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -proc:{none,only}          Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...]Names of the annotation processors to run; bypasses default discovery process
  -processorpath <path>      Specify where to find annotation processors
  -d <directory>             Specify where to place generated class files
  -s <directory>             Specify where to place generated source files
  -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -version                   Version information
  -help                      Print a synopsis of standard options
  -Akey[=value]              Options to pass to annotation processors
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system
  -Werror                    Terminate compilation if warnings occur


[app@sunshiny classes]$ java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available
    -server       to select the "server" VM
                  The default VM is server.

    -cp <class app path of directories and zip/jar files>
    -classpath <class app path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to app for class files.
    -D<name>=<value>
                  set a system property
    -verbose[:class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-app | -jre-no-restrict-app
                  include/exclude user private JREs in the version app
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See http://java.sun.com/javase/reference for more details.



# Java 컴파일시 인코딩 옵션
javac -encoding UTF-8 -classpath Test.java

# Java 실행시 인코딩 옵션
java -Dfile.encoding=UTF-8 -classpath Test

댓글 없음:

댓글 쓰기