클래스가 위치하는 경로를 지정해서 자바가 필요로 하는 클래스를 로드할 수 있는 방법.
package ClassPathDemo;
class Item {}
class ClassPathDemo{}
public class ClassPath {
public static void main(String[] args) {
}
}
👉 맥북에서 파일/폴더 경로 따기
1)option키
+ 우클릭 -‘’의 경로이름 복사
클릭
2) terminal에 해당 파일/폴더drag & drop
3) textEdit에 해당 파일/폴더drag & drop
4) finder의 경로 막대에서 우클릭 -‘’의 경로이름 복사
클릭
joyejiui-MacBook-Pro:~ yj$ cd /Users/yj/eclipse-workspace/java_tutorials/src/ClassPathDemo
joyejiui-MacBook-Pro:ClassPathDemo yj$ ls -al
total 8
drwxr-xr-x 3 yj staff 96 8 2 17:12 .
drwxr-xr-x 6 yj staff 192 8 2 17:12 ..
-rw-r--r-- 1 yj staff 174 8 2 17:13 ClassPath.java
javac
: java 파일을 compile 하여 class 파일로 만든다
joyejiui-MacBook-Pro:ClassPathDemo yj$ javac ClassPath.java
class 파일이 생성되어 있는 것을 확인할 수 있다.
joyejiui-MacBook-Pro:ClassPathDemo yj$ ls -al
total 32
drwxr-xr-x 6 yj staff 192 8 2 17:25 .
drwxr-xr-x 6 yj staff 192 8 2 17:12 ..
-rw-r--r-- 1 yj staff 277 8 2 17:25 ClassPath.class
-rw-r--r-- 1 yj staff 174 8 2 17:13 ClassPath.java
-rw-r--r-- 1 yj staff 210 8 2 17:25 ClassPathDemo.class
-rw-r--r-- 1 yj staff 201 8 2 17:25 Item.class
class Item3 {
public void printout() {
System.out.println ("Hello World!");
}
}
public class ClassPath3 {
public static void main(String[] args) {
Item3 i1 = new Item3 ();
i1.printout();
}
}
컴파일 : javac 자바파일이름.java
실행 : java 자바파일이름
✋ java compile 오류가 났다
joyejiui-MacBook-Pro:ClassPathDemo yj$ javac ClassPath3 error: Class names, 'ClassPath3', are only accepted if annotation processing is explicitly requested 1 error
찾아보니
java 파일명.java
로 자바 확장자를 붙여줘야하는데 안 붙여줬다.
✋ 실행이 안 된다
오류 :java.lang.NoClassDefFoundError
java.lang.ClassNotFoundException
joyejiui-MacBook-Pro:ClassPathDemo yj$ java ClassPath2 Error: Could not find or load main class ClassPath2 Caused by: java.lang.NoClassDefFoundError: ClassPathDemo/ClassPath2 (wrong name: ClassPath2) joyejiui-MacBook-Pro:ClassPathDemo yj$ java ClassPathDemo.ClassPath2 Error: Could not find or load main class ClassPathDemo.ClassPath2 Caused by: java.lang.ClassNotFoundException: ClassPathDemo.ClassPath2 joyejiui-MacBook-Pro:ClassPathDemo yj$ java ClassPath2.java error: can't find main(String[]) method in class: ClassPathDemo.Item2
해결법)
- https://maternalgrandfather.tistory.com/entry/자바-javalangClassNotFoundException-오류-엄청-간단한-해결법
- https://yangbox.tistory.com/117
일단, 다 지우고 폴더를 다시 만들어서 다른이름으로 프로젝트를 만들어서 오류는 없어졌다.
joyejiui-MacBook-Pro:ClassPathDemo yj$ javac ClassPath3.java
joyejiui-MacBook-Pro:ClassPathDemo yj$ java ClassPath3
Hello World!
클래스가 같은 폴더가 아니라 다른 폴더에 있다면 클래스의 디렉토리를 지정해 줄 필요가 있다.
Item3.class
를 lib
폴더 안에 넣고 ClassPath3
를 실행시키면 오류가 난다.
joyejiui-MacBook-Pro:ClassPathDemo yj$ java ClassPath3
Exception in thread "main" java.lang.NoClassDefFoundError: Item3
at ClassPath3.main(ClassPath3.java:11)
Caused by: java.lang.ClassNotFoundException: Item3
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
classpath를 지정해주면 정상 작동한다.
joyejiui-MacBook-Pro:ClassPathDemo yj$ java -classpath ".:lib" ClassPath3
Hello World!
-classpath ".:lib"
: 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 한다. .
은 현재 디렉토리 내에서 클래스를 찾는다는 뜻이다. :
는 경로와 경로를 구분해주는 구분자이다. lib
현재 디렉토리에 없다면 하위 디렉토리 중 이 폴더에서 클래스를 찾는다는 의미이다.
(처음에 영상보고 세미콜론으로 따라해서 오류남)
다른사람이 만든 클래스를 자신이 만들고 있는 클래스로 가져오기 위해서 경로를 지정할 필요가 있다. 여러 로직이 같은 클래스를 쓴다면 이를 쓰기 위해 경로를 지정할 필요가 있다.
그리고 자바를 실행할 대마다 클래스패스를 지정하는 것은 번거롭다. 이때 환경변수를 사용한다.
운영체제에 설정하는 것이고 어디에 있던 간에 사용할 수 있기 때문에 약속된 변수를 지정하면 된다.
환경변수를 전체경로로 지정한다.
다른 컴퓨터에는 환경변수가 설정이 안 되어 있기 때문에 실행이 안 될 수 있다.
shell, bash 등 스크립트에서 환경변수를 지정해놓은 실행파일을 별도로 만들어서 실행하는 경우도 있다.