예를 들어 src/main/java/step02/TypeLab.java에 아래 코드가 있다고 가정합니다.
package step02;
class Person {
}
public class TypeLab {
public static void main(String[] args) {
System.out.println("Hello, Maven and Gradle!");
}
}
✅ package 선언
이게 바이트코드 파일 저장 경로를 결정합니다.
package step02;→step02/폴더 생성
명령어:
javac -d target/classes src/main/java/step02/TypeLab.java
✅ 이 과정에서:
Person.classTypeLab.class이 생성되어:
target
└── classes
└── step02
├── Person.class
└── TypeLab.class
에 저장됩니다.
Maven은 pom.xml에 프로젝트 메타데이터를 정의합니다.
예시 pom.xml 핵심 부분:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo-project</artifactId>
<version>1.0.0</version>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<outputDirectory>target/classes</outputDirectory>
</build>
</project>
✅ Maven 빌드 명령:
mvn clean compile
✅ Maven 내부 동작:
cleantarget/ 폴더 삭제compilesrc/main/java 소스 검색javac로 컴파일package에 맞춰 target/classes/패키지명/*.class 생성.m2/repository에 저장)⚠️ Maven은 항상 target/ 디렉토리를 결과물 저장소로 사용합니다.
✅ 실행:
java -cp target/classes step02.TypeLab
Gradle은 build.gradle 파일에 스크립트를 작성합니다.
예시 build.gradle:
plugins {
id 'java'
}
group = 'com.example'
version = '1.0.0'
sourceCompatibility = '17'
targetCompatibility = '17'
✅ Gradle 빌드 명령:
gradle clean build
또는
./gradlew clean build
✅ Gradle 내부 동작:
cleanbuild/ 폴더 삭제buildcompileJava
src/main/java 소스 검색javac로 컴파일build/classes/java/main/패키지명/*.class 생성processResources (리소스 복사)
jar (JAR 파일 생성)
✅ 결과 폴더 구조:
build
├── classes
│ └── java
│ └── main
│ └── step02
│ ├── Person.class
│ └── TypeLab.class
├── libs
│ └── demo-project-1.0.0.jar
✅ 실행:
java -cp build/classes/java/main step02.TypeLab
또는 (JAR 실행)
java -cp build/libs/demo-project-1.0.0.jar step02.TypeLab
(단, main-class 메타데이터가 있어야 -jar 실행 가능)
| 단계 | Maven | Gradle | javac 직접 실행 |
|---|---|---|---|
| 소스 위치 | src/main/java | src/main/java | 임의 경로 |
| 빌드 명령 | mvn clean compile | gradle clean build | javac |
| 클래스 출력 | target/classes | build/classes/java/main | 지정 폴더 |
| 의존성 관리 | pom.xml | build.gradle | 수동 JAR 추가 |
| JAR 생성 | mvn package | gradle jar | 별도 실행 |
✅ 패키지 선언
.class 저장 경로를 지정합니다.✅ 컴파일러(javac)
✅ Maven/Gradle
javac 호출 + 의존성 관리 + JAR 빌드 + 라이프사이클 관리target, build)에 결과물을 생성합니다.javac를 래핑(wrapping)하는 도구입니다.package 선언과 폴더 구조가 어긋나면 컴파일 에러가 납니다.