ความแตกต่างระหว่างไฟล์ war และ jar
อันที่ จริง ไล บรารี่ jar เป็นเพียงไฟล์เก็บถาวร zip ซึ่งตามหลังชื่อของมันโดยตรง: Java Archive ส่วนใหญ่มักจะมีเพียงสี่สิ่ง:
- คลาสที่รวบรวม;
- ทรัพยากร: ไฟล์คุณสมบัติและอื่น ๆ ;
- รายการ MANIFEST.MF;
- ไลบรารี jar อื่น ๆ (หายาก)
โครงสร้างทั่วไปของไฟล์เก็บถาวรมีลักษณะดังนี้:
META-INF/
MANIFEST.MF
com/
codegym/
MyApplication.class
application.properties
ทีนี้มาดูไฟล์สงครามทั่วไปกัน อย่างไรก็ตาม สงครามไม่ได้มาจากคำว่าสงคราม แต่มาจากW eb Ar chive โครงสร้างของไฟล์สงครามมักจะซับซ้อนกว่า ส่วนใหญ่มักประกอบด้วยสองส่วน:
- ส่วนจาวา
- คลาสที่รวบรวม
- ทรัพยากรสำหรับคลาสจาวา: ไฟล์คุณสมบัติและอื่น ๆ
- ไลบรารี 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 จะต้องอัพโหลดไปยังเว็บเซิร์ฟเวอร์ มันไม่ได้เริ่มต้นขึ้นเอง
ปลั๊กอินไฟล์ war กับ maven-war-plugin
สมมติว่าเรามีโครงการเว็บง่ายๆ ให้โครงการได้รับโครงสร้างไฟล์เราจะรวบรวมได้อย่างไร
|-- 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 ของคุณจะถูกคลายเมื่อสร้างในโหมด war:exploded
คุณสามารถเรียนรู้เกี่ยวกับการตั้งค่าปลั๊กอินอื่นๆ ได้จากหน้าอย่างเป็นทางการ
สร้างเว็บแอปพลิเคชันโดยใช้ SpringBoot
ฉันต้องการแยกตัวอย่างการประกอบจริงบางส่วน อย่าคิดเล็กคิดน้อยและพิจารณาสิ่งนี้โดยใช้แอปพลิเคชันตัวอย่างที่ใช้ SpringBoot
ขั้นตอนแรก. สร้างโครงการเว็บ Maven ที่ว่างเปล่าด้วย IDEA
ขั้นตอนที่สอง เพิ่มการขึ้นต่อกันของสปริงใน pom.xml
<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>
ขั้นตอนที่สาม สร้างคลาส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 framework ว่าคลาสนี้จะถูกใช้เพื่อให้บริการคำขอเว็บที่เข้ามา
ประการที่สองคำอธิบายประกอบ @GetMappingระบุว่าวิธีการของเราจะถูกเรียกใช้เพื่อให้บริการคำขอ GET บน URI รูท - /
ประการที่สาม วิธีการส่งคืนสตริง"ดัชนี " ซึ่งจะบอกให้ SpringBoot framework ส่งคืนเนื้อหาของไฟล์ index.htmlเป็นการตอบสนอง
ขั้นตอนที่สี่ คุณต้องเพิ่มไฟล์ 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
ขั้นตอนที่ห้า ตั้งค่าปลั๊กอินใน pom.xml:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
ฉันประเมินความแข็งแกร่งของฉันสูงเกินไป ต้องใช้เวลามากในการแยกวิเคราะห์ตัวอย่างง่ายๆ แต่คุณสามารถดาวน์โหลดรหัสเต็มของโครงการได้จาก GitHub และพยายามทำความเข้าใจด้วยตัวเอง อย่างไรก็ตาม 80% ของเวลาทำงานของคุณ คุณจะทำอย่างนั้น :)
คุณสามารถดาวน์โหลดโค้ดฉบับเต็มได้จากลิงก์ใน GitHub
GO TO FULL VERSION