Main.java
```java
import com.naver.Math;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
Math math = new Math();
int a = 1;
int b = 3;
System.out.printf("1 + 3 = %d\n", math.sum(a, b));
System.out.println("Program terminated successfully");
}
}
```
Math.java
```java
package com.naver;
public class Math {
public int sum(int a, int b) {
return a + b;
}
}
```
컴파일
$ mkdir out
$ javac -d ./out Main.java
결과
.
├── Main.java
├── com
│ └── naver
│ └── Math.java
└── out
├── Main.class
└── com
└── naver
└── Math.class
실행
java -cp ./out Main
-cp 로 classpath를 지정해주지 않으면 Main을 찾을 수 없다는 오류가 발생한다.
패키지 이동
.
├── com
│ └── naver
│ ├── etc
│ │ └── Math.java
│ └── main
│ └── Main.java
└── out
패키지 이동 시 package 문도 변경해줘야 한다.
변경해주지 않으면 file does not contain class com.naver.etc.Math와 같은 오류가 발생한다.
당연히 import 경로도 제대로..
컴파일(Main.java는 package 문이 작성되지 않았음)
javac -d ./out com/naver/main/Main.java
.
├── com
│ └── naver
│ ├── etc
│ │ └── Math.java
│ └── main
│ └── Main.java
└── out
├── Main.class
└── com
└── naver
└── etc
└── Math.class
package 경로를 작성하지 않은 Main의 위치는 ./out 이었다.
Main.java에 package 경로 추가 후 다시 컴파일
.
├── com
│ └── naver
│ ├── etc
│ │ └── Math.java
│ └── main
│ └── Main.java
└── out
└── com
└── naver
├── etc
│ └── Math.class
└── main
└── Main.class
실행
java -cp ./out com.naver.main.Main
패키지를 담는 상위 디렉토리를 classpath에 추가해준다.
java -cp out/com/naver/main Main 로 실행하면 오류가 발생한다.
정확한 이유를 찾진 못했는데, 패키지 경로는 classpath로 작성하지 않는 것이 원칙인 듯하다.
jar
기능
명령어
jar 생성
jar cf [jar-file] [input-file(s)]
jar 파일 내용 보기
jar tf [jar-file]
jar 파일 extract
jar xf [jar-file]
jar 파일 내 특정 파일들만 extract
jar xf [jar-file] [archived-file(s)]
java application 실행
java -jar app.jar
application 실행 시 Manifest header에 Main-Class 항목이 정의되어 있어야 한다.
jar application의 entry point인 main 메서드를 가진 클래스 명시
해당 항목이 없으면 no main manifest attribute in jar 오류 발생
jar 하나로 묶기
초기 디렉토리 상태(컴파일 이후)
.
├── MANIFEST.MF
├── com
│ └── naver
│ ├── etc
│ │ └── Math.java
│ └── main
│ └── Main.java
└── out
└── com
└── naver
├── etc
│ └── Math.class
└── main
└── Main.class
java package, import, compile, execute
초기 디렉토리 구조
Main.java
```java import com.naver.Math; public class Main { public static void main(String[] args) { System.out.println("Hello world"); Math math = new Math(); int a = 1; int b = 3; System.out.printf("1 + 3 = %d\n", math.sum(a, b)); System.out.println("Program terminated successfully"); } } ```Math.java
```java package com.naver; public class Math { public int sum(int a, int b) { return a + b; } } ```컴파일
결과
실행
-cp
로 classpath를 지정해주지 않으면 Main을 찾을 수 없다는 오류가 발생한다.패키지 이동
package
문도 변경해줘야 한다.file does not contain class com.naver.etc.Math
와 같은 오류가 발생한다.import
경로도 제대로..컴파일(Main.java는
package
문이 작성되지 않았음)package
경로를 작성하지 않은 Main의 위치는./out
이었다.Main.java에
package
경로 추가 후 다시 컴파일실행
java -cp out/com/naver/main Main
로 실행하면 오류가 발생한다.jar
jar cf [jar-file] [input-file(s)]
jar tf [jar-file]
jar xf [jar-file]
jar xf [jar-file] [archived-file(s)]
java -jar app.jar
Main-Class
항목이 정의되어 있어야 한다.no main manifest attribute in jar
오류 발생jar 하나로 묶기
초기 디렉토리 상태(컴파일 이후)
MANIFEST.MF
-C
옵션으로 줘야 제대로 인식한다.cd
로 해당 경로로 이동시켜야 한다.cd out && jar cvmf ../MANIFEST.MF example.jar ./*
Error: Could not find or load main class ...
오류가 발생한다.jar 실행
classpath 추가해 jar 내 main 클래스 실행
jars
디렉토리를 만든 후example.jar
를 옮기면또는
과 같이 main 클래스를 가진 jar 경로를 classpath로 추가해 실행할 수 있다.
소스코드를 외부 라이브러리로 만들어 실행
먼저
sh.lee.Math
클래스를 별도 jar로 만들고 소스코드와 .class 파일을 지운다.이후 메인 클래스를
./libs/*
를 classpath에 넣지 않고 컴파일하면 라이브러리를 찾지 못하는 오류가 발생한다.실행할 땐
out
,libs
모두 classpath에 등록해야 한다.A. 참조