자바 프로젝트를 실행할 때는 컴파일이 완료된 프로젝트 파일의 압축형태의 실행파일 .jar파일로 배포를 진행한다.
단일 파일 컴파일
코드로 작성한 자바파일을 실행시키기 위해선 컴파일 과정을 거쳐야한다.
이 때 자바 단일 파일은 컴파일 이후 즉시 실행시킬 수 있다.
javac HelloWorld.java
------ 컴파일 완료(Helloworld.class파일 생성) ------
java HelloWorld
위와 같은 명령어를 통해 실행이 가능
멀티 파일 컴파일
javac -d out src/com/example/*.java
--- 외부 라이브러리(jar) 참조
javac -d out -cp "libs/*" src/com/example/*.java
srt/com/example/ 내의 전체 파일을 탐색하여 컴파일
jar 파일 생성
jar cfe HelloWorld.jar HelloWorld HelloWorld.class
c : 새로운 JAR파일 생성
f : 출력 JAR 파일 이름을 지정
e : 실행 파일의 진입점(메인 클래스)
java -jar HelloWorld.jar
위와 같이 실제 컴파일 이후 실행(배포)까지의 과정이 상당히 번거롭다
때문에 이후 여러 컴파일, 빌드 도구가 나왔는데, 대표적으로 Maven, Gradle이 있다.
빌드 도구
Gradle은 빌드 도구라고 불리는데 다음과 같은 작업을 돕는다.
- 컴파일
- 개발된 프로젝트는 하나의 파일로 실행되지 않기 때문에 여러 파일을 모두 컴파일, 외부 라이브러리 등록+컴파일 등 여러 작업을 한번에 진행해야 한다.
때문에 명령어로 관리하기 힘들어졌고, 빌드 도구가 나오게 되었다.
- 개발된 프로젝트는 하나의 파일로 실행되지 않기 때문에 여러 파일을 모두 컴파일, 외부 라이브러리 등록+컴파일 등 여러 작업을 한번에 진행해야 한다.
- 의존성 관리
- 프로젝트에서 필요한 라이브러리, 모듈등을 등록 후 간편하게 사용할 수 있다.(build.gradle 파일 의존성 설정)
- 패키징
- 프로젝트의 전체 파일을 컴파일 및 외부 라이브러리를 등록 후 패키징 작업을 진행한다.
패키징 파일은 .jar or .war로 패키징 되고, 이 패키징 된 파일을 실행하면 배포가 가능하다.
- 프로젝트의 전체 파일을 컴파일 및 외부 라이브러리를 등록 후 패키징 작업을 진행한다.
- 테스트 자동화
- 별도로 작성된 테스트 코드를 실행하여 프로젝트의 런타임 환경의 실 테스트를 진행한다.
- 빌드 파이프라인(CI/CD) 통합
.jar 파일이란
myFile.jar
│
├── META-INF/
│ └── MANIFEST.MF # 메타데이터와 JAR 파일의 정보가 포함된 파일
│
├── com/
│ └── example/
│ ├── MyClass.class # 패키지에 속한 컴파일된 클래스 파일들
│ └── AnotherClass.class
│
├── resources/
│ ├── config.properties # 리소스 파일
│ └── image.png # 이미지 파일
│
└── lib/
├── library1.jar # 포함된 라이브러리 파일들
└── library2.jar
+ 스프링 부트 사용시
│
└──BOOT-INF/
├── layers.idx # 스프링 부트 메타정보
└── classpath.idx
.jar파일은 프로젝트를 실행하기 위한 최종 단계인데, 아래와 같은 명령어를 통해 생성한 프로젝트 파일을 실행할 수 있다.
java -jar myFile.jar
- jar파일은 자바 프로젝트를 실행할 수 있도록 만들어진 zip파일 형식의 압축 파일이다.
- 클래스 파일의 묶음 jar파일은 실행할 수 있는 상태이기에 기본적으로 컴파일 작업이 완료된 .class 파일로 변환되어 있다.
- jar파일에는 메타데이터가 포함된 META-INF/MANIFEST.MF 파일이 있다. 이 파일에는 jar파일의 메타정보가 들어있다(버전 정보, 메인클래스 등)
- 메인 클래스를 반드시 설정해야 이후 jar파일이 실행 가능하다.
- 메인 클래스를 설정하지 않는 경우도 있는데 이 경우는 외부 라이브러리 배포용도로 사용할 때는 실행할 필요가 없기에 설정하지 않는다.
BOOT-INF
META-INF/MANIFEST.MF
Manifest-Version: 1.0
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: org.itech.techsignapi.TechsignApiApplication
Spring-Boot-Version: 2.7.18
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
아래는 스프링 부트를 사용하면 그래들 빌드 시 같이 넘어오는 정보
BOOT-INF/layers.idx
- "dependencies":
- "BOOT-INF/lib/"
- "spring-boot-loader":
- "org/"
- "snapshot-dependencies":
- "application":
- "BOOT-INF/classes/"
- "BOOT-INF/classpath.idx"
- "BOOT-INF/layers.idx"
- "META-INF/"
- 스프링 부트 애플리케이션의 레이어드 JAR 구조를 정의하는 파일로, 각 파일이 어떤 레이어에 속하는지를 기록
BOOT-INF/classpath.idx
- "BOOT-INF/lib/spring-cloud-starter-openfeign-3.1.7.jar"
- "BOOT-INF/lib/spring-cloud-openfeign-core-3.1.7.jar"
- "BOOT-INF/lib/spring-cloud-starter-3.1.6.jar"
- "BOOT-INF/lib/jjwt-0.9.1.jar"
- "BOOT-INF/lib/jaxb-api-2.3.1.jar"
- "BOOT-INF/lib/springdoc-openapi-ui-1.6.15.jar"
- "BOOT-INF/lib/gson-2.8.7.jar"
- "BOOT-INF/lib/querydsl-jpa-5.0.0.jar"
- "BOOT-INF/lib/querydsl-apt-5.0.0.jar"
- "BOOT-INF/lib/s3-2.20.42.jar"
- "BOOT-INF/lib/aws-java-sdk-s3-1.12.281.jar"
- "BOOT-INF/lib/ec2-2.16.47.jar"
- "BOOT-INF/lib/aws-xml-protocol-2.20.42.jar"
- "BOOT-INF/lib/aws-query-protocol-2.20.42.jar"
- "BOOT-INF/lib/protocol-core-2.20.42.jar"
- "BOOT-INF/lib/aws-core-2.20.42.jar"
- "BOOT-INF/lib/auth-2.20.42.jar"
- "BOOT-INF/lib/regions-2.20.42.jar"
...
- 스프링 부트 애플리케이션의 클래스패스 정보를 기록하여, 애플리케이션이 실행될 때 필요한 리소스와 클래스를 정확히 로드할 수 있도록 돕는다.
'공부 > Java' 카테고리의 다른 글
우테코 프리코스 6기 1주차 숫자야구 회고 (0) | 2023.10.26 |
---|---|
자바의정석 ch14 람다와 스트림 (0) | 2023.09.18 |
BufferedReader, StringTokenizer (0) | 2023.01.14 |
nextInt()입력 후 nextLine()사용 시 주의점 (0) | 2022.12.18 |