2014년 8월 4일 월요일

[java package compile,자바패키지컴파일,javac,java]자바패키지컴파일,java package compile, javac -d, java -cp, 현재디렉토리(.)

[java package compile,자바패키지컴파일,javac,java]자바패키지컴파일,java package compile, javac -d, java -cp, 현재디렉토리(.)

현재 별다르게 환경변수에서 클래스패스 설정은 하지 않았다.

1. 아래의 3개 자바파일(Shape.java Circle.java, Rectangle.java)을c:\java\project\source에 만들자.

//Shape.java
package shape;

public abstract class Shape {
protected int posX, posY;
public abstract void draw();
}

//Circle.java
package shape;

public class Circle extends Shape {

public void draw() {
System.out.println( "동그라미 그림..." );
}
}


//Rectangle.java
package shape;

public class Rectangle extends Shape {
public void draw() {
System.out.println( "네모 그림..." );
}
}





2. -d option을 이용하여 자바 컴파일을 해보자.

c:\java\project\source>javac -d c:\java *.java

위 3개의 클래스가 package shape 구문을 포함하고 있으므로 c:\java 아래 shape 폴더를 만들고 그안에 컴파일된 클래스 파일이 위치한다.

3. 이번에는 위에서 작성한 클래스를 사용하는 c:\java\project\MyApplication.java 파일을 만들다.


import shape.*;

class MyApplication {
public static void main( String[] args ) {
new Rectangle().draw();
new Circle().draw();
}
}



먼저 컴파일을 해야 하는데 MyApplication.java 파일의 맨위에서 import shape 했으므로 클래스패스 루트아래 shape 폴더가 있어야 한다. 

만약 c:\java\project>javac MyApplication.java 라고 한다면 다음과 같은 오류가 발생한다.

C:\java\project>javac MyApplication.java
MyApplication.java:1: error: package shape does not exist
import shape.*;
^
MyApplication.java:5: error: cannot find symbol
                new Rectangle().draw();
                    ^
  symbol:   class Rectangle
  location: class MyApplication
MyApplication.java:6: error: cannot find symbol
                new Circle().draw();
                    ^
  symbol:   class Circle
  location: class MyApplication


별다른 클래스패스 설정을 하지 않았으므로 현재 폴더는 클래스를 찾는 기본 폴더이다.(클래스패스 루트) 현재 폴더 기준으로 shape 폴더가 없으므로 오류가 발생하는 것이다.

그래서 -cp 옵션으로 컴파일시 클래스패스를 지정하자(c:\java)

C:\java\project>javac -cp c:\java MyApplication.java


4. 이번에는 MyApplication 클래스 파일을 실행해보자.

아래의 경우 MyApplication 클래스 파일은 현재 디렉토리에 있으므로 찾았지만,
소스코드에서 사용되는 shape 패키지의 Rectangle클래스 파일을 못찾아 오류가 발생했다.

C:\java\project>java MyApplication
Exception in thread "main" java.lang.NoClassDefFoundError: shape/Rectangl
        at MyApplication.main(MyApplication.java:5)
Caused by: java.lang.ClassNotFoundException: shape.Rectangle
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more


아래처럼 해보자.


C:\java\project>java -cp c:\java MyApplication
오류: 기본 클래스 MyApplication을(를) 찾거나 로드할 수 없습니다.


이번에는 명령행에서 -cp 옵션으로 클래스패스를 기술했기 때문에 오로지 그 경로에서만 클래스를 찾게되어
MyApplication 클래스 파일을 못찾은 경우이다.


결론적으로 아래와 같이 하면 된다.


C:\java\project>java -cp c:\java;. MyApplication
네모 그림...
동그라미 그림...

댓글 없음:

댓글 쓰기