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의 링크에서 전체 코드를 다운로드할 수 있습니다 .
GO TO FULL VERSION