How to Run a Class Within a WAR File Using the Command Line
1. 개요
WAR 파일(Web Application Archive의 약어)은 Java 웹 애플리케이션의 리소스를 저장합니다. WAR는 모든 웹 구성 요소를 단일 단위로 패키징합니다. JAR 파일, JavaServer Pages, Java 서블릿, Java 클래스 파일, XML 파일, HTML 파일 및 웹 애플리케이션에 필요한 기타 리소스를 포함하고 있습니다.
본 튜토리얼에서는 CLI를 사용하여 WAR 파일 내에서 클래스를 호출하는 방법을 보여줍니다.
2. WAR 파일 구조
WAR 파일은 .war 확장자를 사용하며, Servlet/JSP 컨테이너에 배포할 수 있는 웹 애플리케이션을 패키징합니다.
다음은 전형적인 WAR 파일 구조의 예입니다:
META-INF/
MANIFEST.MF
WEB-INF/
web.xml
jsp/
helloWorld.jsp
classes/
com/baeldung/*.class
application.properties
static/
templates/
lib/
// third party *.jar files as libs
index.html
내부에는 웹 아카이브에 대한 유용한 정보를 담고 있는 MANIFEST.MF가 있는 META-INF 디렉토리가 있습니다. META-INF 디렉토리는 개인적이며 외부에서 접근할 수 없습니다.
WEB-INF 디렉토리는 모든 배포 정보 및 애플리케이션 코드를 포함하는 특별한 디렉토리입니다. WEB-INF/classes 및 WEB-INF/lib 디렉토리에는 각각 Java 클래스 파일 및 JAR 라이브러리가 포함되어 있습니다. WAR 파일은 HTML 페이지, 이미지 및 JS 파일을 포함한 모든 정적 웹 리소스도 가지고 있습니다.
3. WAR 파일 내 클래스 실행하기
명령줄을 통해 WAR 파일에서 클래스를 실행하는 다양한 접근 방식을 살펴봅시다.
3.1. java 명령으로 -classpath 옵션 사용하기
Java 가상 머신(JVM)은 Java 프로그램을 실행할 때 클래스를 찾고 로드하기 위해 클래스패스 환경 변수를 사용합니다. JVM이 클래스 파일을 찾고 로드해야 하는 디렉토리, JAR 및 ZIP 파일 목록을 지정합니다.
아래의 java 명령을 살펴보며 WAR를 실행하는 방법과 그 출력 결과를 확인하겠습니다. -classpath 옵션 대신 -cp를 사용할 수도 있습니다:
java -classpath target/maven-generate-war/WEB-INF/classes:target/maven-generate-war/WEB-INF/lib/* com.baeldung.MavenGenerateWarApplication
위의 명령은 main 메서드를 실행하고 아래의 출력을 생성한 후 완료되면 서버를 종료합니다:
...
3.2. java 명령으로 —jar 옵션 사용하기
Spring Boot를 사용하면 애플리케이션에 직접 내장 서버(예: Tomcat)를 포함한 WAR 파일을 빌드할 수 있습니다. WAR 파일을 외부 서블릿 컨테이너(예: Apache Tomcat)에 배포할 필요가 없습니다. WAR 파일에는 애플리케이션을 실행하는 데 필요한 모든 것이 포함되어 있습니다.
MavenGenerateWarApplication 클래스를 pom.xml의 mainClass로 지정했습니다.
이제 아래 명령을 실행하여 WAR 파일을 실행하겠습니다:
java -jar target/war-with-main-class.war
위 명령을 실행하면 MavenGenerateWarApplication 클래스가 실행되고, 서버가 시작되며 계속 실행됩니다. Spring Boot 애플리케이션이 시작되었음을 보여주는 아래 출력을 볼 수 있습니다:
2025-01-26 01:25:19.762 INFO ... : Starting service [Tomcat]
2025-01-26 01:25:19.763 INFO ... : Starting Servlet engine: [Apache Tomcat/9.0.74]
2025-01-26 01:25:20.256 INFO ... : Initializing Spring embedded WebApplicationContext
...
4. 결론
본 기사에서는 Java에서 명령줄을 통해 WAR 파일을 실행하는 다양한 접근 방식을 논의했습니다.
내장 서버를 사용하는 현대 웹 애플리케이션 실행에는 java -jar가 최선의 옵션이며, 반면 java -classpath는 서블릿 컨테이너 없이 비웹 구성 요소를 실행하는 데 더 효과적입니다.
이 기사에 사용된 코드는 GitHub에서 확인할 수 있습니다.