라이브러리 복사: copy-dependencies를 사용하면 Maven이 프로젝트에서 사용하는 모든 의존성(예: 다른 외부 라이브러리)을 지정한 폴더에 복사합니다. 대부분의 경우 target/libs 폴더에 복사됩니다.
실행 환경 설정: 복사된 의존성 라이브러리들이 해당 폴더에 모이면, JAR 파일이 이러한 라이브러리를 참조하여 실행됩니다.
이때 프로젝트의 MANIFEST.MF 파일에서 클래스 경로(Class-Path)가 제대로 설정되어 있어야 합니다.
이는 외부 라이브러리를 참조할 수 있도록 도와주는 중요한 설정입니다.
MANIFEST.MF와 Class-Path
MANIFEST.MF는 JAR 파일 안의 메타데이터를 정의하는 파일입니다. 여기에는 주로 버전 정보, 메인 클래스, 클래스 경로 등 중요한 정보들이 들어 있습니다.
메인 클래스(Main-Class): 어떤 클래스를 실행할지 지정합니다.
JAR 파일을 실행할 때 이 메인 클래스를 기준으로 프로그램이 동작합니다.
클래스 경로(Class-Path): 프로그램이 실행될 때 참조할 라이브러리 경로를 설정합니다. target/libs 폴더에 복사된 의존성 라이브러리들을 MANIFEST.MF에 설정된 경로를 통해 참조할 수 있게 해야 합니다.
Manifest-Version: 1.0
Main-Class: com.example.MainApp
Class-Path: libs/library1.jar libs/library2.jar
위처럼 Class-Path를 설정하면, 프로그램 실행 시 libs 폴더 안에 있는 라이브러리들을 참조할 수 있게 되어 프로그램이 정상적으로 실행됩니다.
Maven으로 빌드한 프로젝트의 JAR 파일을 실행할 때, 의존성을 제대로 설정하는 것이 중요합니다. 다음과 같은 방법으로 JAR 파일과 그 의존성들을 함께 실행할 수 있습니다.
JAR 실행: java -jar target/my-app.jar 명령어로 실행할 수 있습니다. 그러나 이때 Class-Path가 올바르게 설정되지 않으면 외부 라이브러리를 찾지 못해 실행 오류가 발생할 수 있습니다.
의존성 포함된 JAR 빌드: Maven 플러그인 중 하나인 maven-shade-plugin을 사용하면 의존성 라이브러리를 모두 하나의 JAR 파일로 병합할 수 있습니다. 이렇게 하면 MANIFEST.MF에서 클래스 경로를 별도로 설정하지 않아도 의존성을 해결할 수 있습니다.
추가로 알아둘 점
unzip으로 JAR 파일을 열면 META-INF 폴더 안에 MANIFEST.MF 파일이 있습니다. 이 파일을 통해 프로젝트의 메타데이터와 클래스 경로 등을 확인할 수 있습니다.
복제된 의존성 관리: 의존성을 복제한 후에는 JAR 파일이 해당 라이브러리들을 참조할 수 있게 환경을 설정해 주어야 하며, 이를 수동으로 처리하지 않으려면 maven-shade-plugin 또는 maven-assembly-plugin을 사용할 수 있습니다.
clean: 이전 빌드에서 생성된 파일들을 삭제합니다. 주로 target/ 디렉토리 내의 파일들이 삭제됩니다. 이 명령어를 사용하면 이전 빌드의 산출물이 남아 있지 않게 해주므로, 새로운 빌드를 깨끗하게 시작할 수 있습니다.
validate: 프로젝트가 올바르게 설정되었는지 확인합니다. pom.xml 파일에 정의된 의존성과 구성이 유효한지 검증합니다.
compile: 소스 코드를 컴파일합니다. src/main/java에 있는 Java 소스 파일을 바이트 코드로 컴파일하여 target/classes 폴더에 생성합니다.
test-compile: 테스트 코드를 컴파일합니다. src/test/java에 있는 테스트용 코드를 컴파일합니다.
test: 테스트 코드를 실행합니다. 컴파일된 테스트 코드를 JUnit이나 TestNG 같은 테스트 프레임워크를 사용해 실행하고, 테스트 결과를 보고합니다.
package: 컴파일된 코드를 JAR 파일이나 WAR 파일 같은 배포 가능한 아티팩트로 패키징합니다. 즉, target/my-app.jar처럼 프로젝트를 하나의 파일로 묶습니다.
verify: 테스트 후 검증 작업을 수행합니다. (필요에 따라 사용)
install: 패키징된 아티팩트를 로컬 Maven 리포지토리에 설치합니다. 로컬 리포지토리는 ~/.m2/repository 폴더에 위치합니다.
deploy: 최종적으로 배포 가능한 상태로 만들어 원격 리포지토리에 배포합니다. 이를 통해 다른 팀이나 프로젝트에서 이 아티팩트를 사용할 수 있습니다.
clean 라이프사이클을 실행하여 이전 빌드에서 생성된 산출물(컴파일된 파일, 패키지, 로그 등)을 삭제합니다.
실행 후 target/ 폴더가 삭제됩니다.
package 명령어는 Maven의 기본(Default) 라이프사이클에서 패키징 단계까지 실행합니다. 소스 코드를 컴파일하고 테스트를 실행한 후, JAR 또는 WAR 파일로 패키징합니다.
결과물로 target/ 디렉토리에 배포 가능한 아티팩트가 생성됩니다.
clean과 package 명령어를 함께 실행합니다. 먼저 이전 빌드의 산출물을 삭제한 후 새로 컴파일, 테스트, 패키징 과정을 진행하여 깔끔한 빌드를 만듭니다.
이 명령어는 대부분의 빌드에서 자주 사용됩니다.
package 이후 패키징된 아티팩트를 로컬 리포지토리에 설치합니다. 이는 다른 로컬 프로젝트에서 해당 아티팩트를 의존성으로 사용할 수 있도록 합니다.
install 단계까지 실행하면 target 폴더에 패키지된 파일뿐만 아니라, Maven의 로컬 리포지토리(~/.m2/repository)에도 해당 파일이 설치됩니다.
deploy는 최종 배포 단계입니다. 원격 리포지토리(사내 리포지토리나 중앙 리포지토리 등)에 패키지된 아티팩트를 업로드하여 다른 팀이나 프로젝트에서도 사용할 수 있게 합니다.