war 파일과 jar 파일의 차이점

실제로 jar 라이브러리는 Java Archive라는 이름 에서 바로 이어지는 zip 아카이브일 뿐입니다 . 대부분 다음 네 가지만 포함합니다.

  • 컴파일된 클래스;
  • 리소스: 속성 파일 등;
  • 매니페스트 MANIFEST.MF;
  • 다른 jar 라이브러리(희귀).

이러한 아카이브의 일반적인 구조는 다음과 같습니다.

  META-INF/
  	MANIFEST.MF
  com/
  	codegym/
	      MyApplication.class
  application.properties

이제 일반적인 war 파일을 살펴보겠습니다. 그런데 전쟁은 전쟁이라는 단어에서 나온 것이 아니라 아카이브 에서 나온 입니다 . war 파일의 구조는 일반적으로 더 복잡합니다. 대부분 두 부분으로 구성됩니다.

  • 자바 부분
    • 컴파일된 클래스
    • Java 클래스용 리소스: 속성 파일 등
    • 다른 jar 라이브러리(종종)
    • 매니페스트 MANIFEST.MF
  • 웹 파트
    • web-xml - 웹 서비스 배포 설명자
    • JSP 서블릿
    • 정적 웹 리소스: HTML, CSS, JS 파일

일반적인 war 파일의 예:

META-INF/
    MANIFEST.MF
WEB-INF/
    web.xml
    jsp/
    	helloWorld.jsp
    classes/
    	static/
    	templates/
    	application.properties
    lib/
    	// *.jar files as libs

중요한! jar 파일은 자바 머신으로만 실행할 수 있지만 war 파일을 실행하려면 웹 서버에 업로드해야 합니다. 자체적으로 시작되지 않습니다.

maven-war-plugin을 사용한 war 파일 플러그인

간단한 웹 프로젝트가 있다고 상상해 봅시다. 프로젝트에 이러한 파일 구조가 주어지면 어떻게 조립합니까?

|-- pom.xml
 `-- src
 	`-- main
     	|-- java
     	|   `-- com
     	|   	`-- example
     	|       	`-- projects
     	|           	`-- SampleAction.java
     	|-- resources
     	|   `-- images
     	|   	`-- sampleimage.jpg
     	`-- webapp
         	|-- WEB-INF
         	|   `-- web.xml
         	|-- index.jsp
         	`-- jsp
             	`-- websource.jsp

먼저, 우리는 Maven에게 이 모든 것을 war 파일 로 빌드하도록 지시해야 합니다 . 예를 들면 다음과 같은 <package> 태그가 있습니다.

	<project>
  	...
      <groupId>com.example.projects</groupId>
      <artifactId>simple-war</artifactId>
  	<packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
  	<name>Simple War Project</name>
      <url>http://codegym.cc</url>
  	...
    </project>

둘째, maven-war-plugin 플러그인을 포함해야 합니다 . 예:

  <build>
	<plugins>
  	<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
    	<version>3.3.2</version>
    	<configuration>
          <webappDirectory>/sample/servlet/container/deploy/directory</webappDirectory>
    	</configuration>
      </plugin>
    </plugins>
  </build>

여기서는 나중에 구성할 수 있는 플러그인을 간단히 정의합니다. 또한 webappDirectory 태그를 사용하여 프로젝트가 배포될 디렉터리를 재정의합니다. 이제 제가 말하는 내용에 대해 자세히 말씀 드리겠습니다.

플러그인은 두 가지 빌드 모드(두 가지 유형의 목표)로 설정할 수 있습니다.

  • 전쟁:전쟁
  • 전쟁:폭발

첫 번째 경우 결과 war 파일은 단순히 대상 폴더에 배치되고 이름은 <artifactId>-<version>.war 입니다 .

그러나 내부의 웹 서버에서 압축을 푼 상태에서 war 파일의 내용을 최종 폴더에 넣도록 플러그인에 "요청"할 수 있습니다. 이를 위해 목표 war:exploded 가 사용됩니다 .

두 번째 접근 방식은 Intellij IDEA에서 직접 프로젝트를 실행하거나 디버깅하는 경우에 자주 사용됩니다.

그건 그렇고, 위 예제의 webappDirectory 태그를 사용 하면 war:exploded 모드에서 빌드할 때 war 파일의 압축이 풀릴 디렉토리를 재정의할 수 있습니다.

공식 페이지 에서 다른 플러그인 설정에 대해 알아볼 수 있습니다 .

SpringBoot 기반 웹 애플리케이션 구축

글쎄, 나는 실제 조립 예제를 분해하고 싶습니다. 사소한 일이 아니라 SpringBoot를 기반으로 하는 예제 애플리케이션을 사용하여 이것을 고려하십시오.

1단계. IDEA로 빈 Maven 웹 프로젝트를 만듭니다.

2단계. pom.xml에 Spring 종속성을 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

3단계. com.codegym.spring.MainController 클래스를 생성합니다 . src/main/java 폴더 에 위치해야 합니다 .

@Controller
public class MainController {

	@GetMapping("/")
    public String viewIndexPage(Model model) {
        model.addAttribute("header", "Maven Generate War");
    	return "index";
	}
}

여기에는 3가지가 설명되어 있습니다. 먼저 @Controller 주석은 이 클래스가 수신 웹 요청을 처리하는 데 사용될 것임을 SpringBoot 프레임워크에 알립니다.

둘째, @GetMapping 주석은 루트 URI에서 GET 요청을 서비스하기 위해 메서드가 호출됨을 나타냅니다. - /

셋째, 메서드는 "index" 문자열을 반환합니다 . 이는 SpringBoot 프레임워크에 index.html 파일의 내용을 응답으로 반환하도록 지시합니다 .

4단계. 다음 콘텐츠가 포함된 index.html 파일을 프로젝트에 추가해야 합니다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
    <!-- Bootstrap core CSS -->
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
    <nav class="navbar navbar-light bg-light">
    	<div class="container-fluid">
        	<a class="navbar-brand" href="#">
            	CodeGym Tutorial
        	</a>
    	</div>
    </nav>
    <div class="container">
    	<h1>[[${header}]]</h1>
    </div>
</body>
</html>

html 뿐만이 아닙니다. 콘텐츠가 클라이언트에 제공되기 전에 Thymeleaf 프레임워크 에 의해 서버에서 수정됩니다 . Thymeleaf 라이브러리가 페이지의 내용을 처리하고 수정할 수 있도록 하는 특수 태그가 이 파일에 내장되어 있습니다.

빨간색 태그는 Thymeleaf 라이브러리에서 처리할 태그이고 녹색 태그는 Bootstrap CSS 라이브러리의 스타일입니다.

5단계. pom.xml에서 플러그인을 설정합니다.

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.1</version>
</plugin>

나는 내 힘을 조금 과대평가했다. 간단한 예제를 완전히 파싱하려면 많은 시간이 걸립니다. 그러나 GitHub에서 프로젝트의 전체 코드를 다운로드하고 직접 이해할 수 있습니다. 그건 그렇고, 작업 시간의 80%는 그렇게 할 것입니다 :)

GitHub의 링크에서 전체 코드를 다운로드할 수 있습니다 .