기본 콘텐츠로 건너뛰기

Java 명령어 이해


1.java 명령어로 실행하기

java명령(Java.exe)의 사용법을 잘보면 다음과 같은 옵션이 있다.
    -classpath <class search path of directories and zip/jar files>
                  A ; separated list of directories, JAR archives,
                  and ZIP archives to search for class files.

운영체제에 사용할 명령들이 포함된 경로를 'path'라는 곳에 저장(지정)하여 사용한다는 것을 다들 알 것이다.
(자바를 위한 환경 설정에서 언급되고 있음)
그래서 여러분은 Javac.exe 또는 java.exe가 설치된 경로를 시스템(Windows) 환경변수 "path"에 지정해 두었을 것이다.
하지만 이는 운영체제를 위한 정보일뿐 자바를 위한 환경설정정보는 아닌 것이다.
자바는 VM(Virtual Machine)이다.
실행할 때 마치 또하나의 운영체제인것처럼 환경을 구성하고 그 안에서 실행한다.
그러므로 새로운 응용프로그램을 실행시킬 때마다 환경구성정보가 필요한 것이다.
위의 옵션은 응용프로그램을 구동시킬 때, VM이 알고 있어야할 경로들을 지정하는 것이다.

즉, 자바를 구동할 때 새로운 시스템인 것처럼 경로를 지정하고 실행시킬 대상 클래스를 지정해야만 자바(java.exe)는 대상파일(클래스)를 찾아 원활한 서비스를 할 수 있는 것이다.

이제 결론을 맺어보자.
위에서 java bin/Server/MultiServer라고 입력한 것을 생각해보자.
'bin'이라는 것은 시스템에서 관리를 위해 만들어둔 폴더일뿐, 프로젝트의 패키지경로에는 없는 것이라 했다.
하지만 'bin'이라는 폴더 아래에 우리의 클래스 파일들이 존재하므로 'bin'은 실행을 위한 경로라고 함이 마땅하다.
벌써 정답을 찾은 이들이 있을 것이다.
바로 "-classpath"옵션을 이용해서 폴더부분과 패키지 부분을 별도로 지정하는 방식으로 명려을 구성해야만 한다.

다음처럼 입력을 하고, 결과를 확인하자.
C:\myDoc\Project\svChatPilot> java -classpath bin; Server.MultiServer
정상적으로 우리가 원하는 서비스가 실행될 것이다.

입력한 명령을 해석해보면.. 다음과 같다.

java       -classpath    bin;                 Server.MultiServer
(자바명령)    (경로지정옵션)        실제참조할 경로(들)      실행할 대상 클래스(패키지포함)

실제 참조할 경로에는 다수의 경로가 포함될 수 있다. 이경우에는  ';'를 이용해서 나열하면 된다.
-classpath c:\bin;c:\res;c:\jar;와 같이 다수의 경로를 입력할 수도 있다.
ex)
java -cp .;SampleUnixTest.jar;secomdriver-3.1.1-20110222.jar;lib/commons-logging-1.0.4.jar;lib/dynamic-file-appender-1.0.0.jar;lib/jdom-1.0.jar;lib/kr.co.aim.log4j-1.0.0.jar;lib/log4j-1.2.15.jar;lib/spring-2.0.5.jar;lib/xutil4j-1.0.jar SingleUnixTest




Java 명령어 정리
javac - 자바컴파일러로써, 자바코드를 작성한 소스파일(.java)을 자바 가상머신이 인식할수 있는 바이트 코드(.class)
타입으로 변환시켜주는 명령어 입니다.

사용법: javac <options> <souce files>
예를들어, Hello.java, Greeting.java 두개의 파일이 존재한다면,
javac Hello.java Greeting.java
javac *.java (*을 사용해서, 모든 확장자가 .java인 파일을 컴파일할수 있다.)


1) 옵션:


a) -classpath:

 -classpath(cp) path(파일 절대 경로):
 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는
옵션. 예를 들어,  Hello.java파일이 C:Java 디렉터리에 존재하고, 필요한 클래스 파일들이 C:JavaEngclasses에 위치한다면,
javac -classpath C:JavaEngclasses C:JavaHello.java 로 해주면 된다. 만약 참조할 클래스 파일들이 C:JavaEngclasses외의 
다른 디렉터리에도 존재한다면, C:JavaKorclasses 일경우, 
javac -classpath C:JavaEngclasses;C;JavaKorclasses C:JavaHello.java
그리고, 현재 디렉터리역시 포함하고 싶다면,
javac -classpath .;C:JavaEngclasses;C;JavaKorclasses C:JavaHello.java
기본적으로, dos에서는 .는 현재 디렉터리를 의미하고, ..는 현재 디렉터리의 상위디렉터리를 의미한다. 
또한 classpath 대신 단축어인 cp를 사용해도 된다.
javac -cp C:JavaEngclasses C:JavaHello.java 



b) -d: 
 -d directory
 클래스 파일을 생성할 루트 디렉터리를 지정합니다.
기본적으로 컴파일러는 -d옵션을 주지 않으면, 소스파일이 위치한 디렉터리에 클래스 파일을 생성시킵니다.
예를 들어,  Hello.java파일이 C:Java 디렉터리에 존재하고 클래스 파일의 루트디렉터리를 C:JavaClassfiles라고 하면, 
javac -d C:JavaClassfiles C:JavaHello.java 입니다.

만약 -d 옵션을 사용하려고 하는데, 루트디렉터리(위예에서는 C:JavaClassfiles) 가 존재 하지 않는다면, 
"The system cannot find the path specified"라는 에러 메시지를 보게 됩니다. 
현재 작업 디렉터리가 C:JavaClassfiles 에 위치하면, 
javac -d .Classfiles Hello.java 와 같이 상대 디렉터리로 표현할수 있습니다.



c) -encoding:
-encoding encoding name
소스 파일에 사용된 문자열 인코딩을 설정합니다.
만약 위옵션이 설정되어 있지 않으면, 플래폼의 기본적인 컨버터가 사용되어 집니다.



d) -g:
모든 디버깅 정보를 생성시킵니다.
만약 위옵션이 설정되어 있지 않으면, 기본적으로, 라인넘버만 생성시킵니다.
-g:none: 디버깅 정보를 전혀 생성 시키지 않습니다.
-g:{lines, vars, source}:
위처럼 명시적으로, 몇몇 디버깅 정보를 생성시킬수 있습니다.
lines은 라인정보, vars는 지역변수, sounce는 소스 파일 정보를 나타냅니다.



e) -nowarn:

경고 메시지 (warning message)를 생성시키지 않습니다.



f) -verbose:

컴파일러와 링커가 현재 어느 소스파일이 컴파일되고 있고, 어느 파일이 링크되고 있는지 
그정보를 출력한다.



h) -deprecation:

소스 코드내에서, 사용되어진 deprecated API의 위치 를 출력 합니다.

ex)
C:Java> javac World.java
Note: World.java uses a deprecated API. Recompile with "-deprecation" for details
.
1 warning
C:Java> javac -deprecation World.java
World.java:52: Note: The method java.awt.Dimension size() in class java.awt.Compon
ent has been deprecated.
Dimension d = size();

Note: World.java uses a deprecated API. Please consult the doc-umentation for a be
tter alternative.



i) -sourcepath:

-sourcepath 소스패스

소스파일의 위치를 지정합니다.



j) -target:

-target 자바버젼

지정된 자바버젼의 VM에서 작동 되어지도록 클래스파일을 생성 시킵니다.

1.1
jvm 1.1 버젼에서 호환되어질수 있는 클래스 파일생성
1.2
jvm 1.2 버젼에서 호환되어질수 있는 클래스 파일생성
1.3
jvm 1.3 버젼에서 호환되어질수 있는 클래스 파일 생성

ex)

javac -target 1.2 Helloworld.java 


k) -bootclasspath 패스:

특정한 bootstrap또는 확장 클래스를 지정할수 있다.
기본적으로, 자바컴파일러는 javac(컴파일러명령)이 설치된 플래폼의 bootstrap과 확장클래스들을 통해서, 컴파일작업을 수행하지만,
bootclasspath 옵션을 사용하면, cross-compiling이라고 해서, 다른 자바플래폼의 bootstrap과 확장클래스들을 통해서, 컴파일 할수 있는 기능을 지원한다.
예를들어,
javac -target 1.1 -bootclasspath jdk1.1.7/lib/classes.zip -extdirs "" OldCode.java
컴파일러에게 현재 자신의 bootstrap을 사용하지 말고, jdk1.1.7/lib/classes.zip bootstrap클래스들을 사용해서 컴파일 하라고 
명령하는것이다.
참고로, 모바일자바에서, 모바일폰에 설정된, jvm에 맞도록, 소스코드를 컴파일하기 위해서, 주로 사용되어지는 옵션이다.


l) -extdirs 디렉터리:
특정한, 확장 디렉토리를 지정한다.cross-compiling시 주로, 사용되어지는 옵션이면, 각디렉터리들은 콜론(:)에 의해서, 분리되어진다.
컴파일시, 기술한 디렉터리의 클래스 파일을 참조한다.


댓글

이 블로그의 인기 게시물

Java 환경변수 설정

자바의 classpath 를 사용하는 이유는 프로그램을 작성하면서 참조하는 다양한 라이브러리의 경로를 명시하여, jvm 구동시 이를 동적으로 링크하기 위함이다. 이를 지정하는 방법은 크게 두가지로 구분할 수 있다. 한가지는 시스템이 제공하는 환경변수 설정을 이용하는 방법, 두번째는 java 구동환경에서 option 을 설정을 통해서 명시적으로 지정하는 방법이다. 1.       환경 변수를 이용한 설정 운영체제는 시스템 운영상 필요한 경로를 시스템에 지정해두고서 참조하는 것이 가능하다. 이를 환경 변수라고 부르는데, 자바도 이곳에 필요한 경로를 설정해두고서 이용하는 것이 가능하다. 필요한 환경변수는 Path, CLASSPATH 두개의 환경변수가 필요하며, 첫번째 Path는 운영체제가 명령어를 실행하면서 해당 명령어에 맞는 실행파일을 찾아가는 순서를 명시한 환경변수이다. 이곳에 아래와 같은 식으로 설정을 함으로써 어떤 폴더에서나 자바의 컴파일러인 javac를 접근할 수 있다. PATH=C:\Program Files\Java\jre1.6.0_05\bin;%SystemRoot%\system32;%SystemRoot%; CLASSPATH= .;C:\Program Files\Java\jre1.6.0_05\lib\; 문제는 이렇게 환경변수를 설정하는 경우 컴파일시 다른 버전의 컴파일러를 실행하기 위해서는 변수 설정이 안됐을 때와 마찬가지로 절대경로로 접근해야하는 문제가 존재한다. 이런 상황에서 변리한 버전 변경을 위해서 아래와 같은 테크닉을 이용한다. 또한, 상기에서 보면 CLASSPATH에 현재 경로를 의미하는 . 를 추가했는데, 이는 자바 컴파일러가 명시적으로 CLASSPATH를 지정할 경우 현재 경로를 보지 않기 때문에 환경 변수상에서 현재 폴더를 추가해야만 정상적인 실행이 가능하기 때문이다. JAVAPATH= C:\Program Files\Java\jre1.6.0_05; PATH= %JAVAP