Perbedaan antara file perang dan jar
Faktanya , perpustakaan jar hanyalah arsip zip, yang langsung mengikuti namanya: Java Archive . Paling sering hanya berisi empat hal:
- kelas yang dikompilasi;
- sumber daya: file properti dan sejenisnya;
- manifes MANIFEST.MF;
- perpustakaan jar lainnya (jarang).
Struktur khas arsip seperti ini terlihat seperti ini:
META-INF/
MANIFEST.MF
com/
codegym/
MyApplication.class
application.properties
Sekarang mari kita lihat file perang biasa. Omong-omong , war bukan dari kata war, tapi dari W eb Archive . Struktur file perang biasanya lebih kompleks. Paling sering terdiri dari dua bagian:
- bagian Jawa
- kelas yang dikompilasi
- sumber daya untuk kelas java: file properti dan sejenisnya
- perpustakaan jar lainnya (sering)
- manifes MANIFEST.MF
- bagian web
- web-xml - deskriptor penerapan layanan web
- servlet jsp
- sumber daya web statis: file HTML, CSS, JS
Contoh file perang tipikal:
META-INF/
MANIFEST.MF
WEB-INF/
web.xml
jsp/
helloWorld.jsp
classes/
static/
templates/
application.properties
lib/
// *.jar files as libs
Penting! File jar dapat dijalankan hanya dengan mesin java, tetapi untuk menjalankan file perang, file tersebut harus diunggah ke server web. Itu tidak dimulai dengan sendirinya.
plugin file perang dengan maven-war-plugin
Bayangkan kita memiliki proyek web sederhana. Biarkan proyek diberi struktur file seperti itu, bagaimana kita menyusunnya?
|-- pom.xml
`-- src
`-- main
|-- java
| `-- com
| `-- example
| `-- projects
| `-- SampleAction.java
|-- resources
| `-- images
| `-- sampleimage.jpg
`-- webapp
|-- WEB-INF
| `-- web.xml
|-- index.jsp
`-- jsp
`-- websource.jsp
Pertama, kita perlu memberi tahu Maven untuk membuat semua ini sebagai file perang , ada tag <package> untuk ini , misalnya:
<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>
Kedua, kita perlu menyertakan plugin maven-war-plugin . Contoh:
<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>
Di sini kami hanya mendefinisikan plugin yang dapat dikonfigurasi di masa mendatang. Selain itu, dengan menggunakan tag webappDirectory , kita mendefinisikan ulang direktori tempat proyek akan diterapkan. Sekarang saya akan memberi tahu Anda lebih banyak tentang apa yang saya bicarakan.
Plugin dapat diatur ke dua mode build (dua jenis tujuan):
- perang: perang
- perang: meledak
Dalam kasus pertama, file perang yang dihasilkan hanya ditempatkan di folder target dan diberi nama <artifactId>-<version>.war .
Tetapi Anda dapat "meminta" plugin agar konten file perang ditempatkan di folder terakhir dalam keadaan di mana ia akan dibongkar oleh server web di dalamnya. Untuk ini, perang tujuan: meledak digunakan .
Pendekatan kedua sering digunakan jika Anda menjalankan atau men-debug proyek langsung dari Intellij IDEA.
Omong-omong, tag Direktori webapp pada contoh di atas memungkinkan Anda untuk mendefinisikan ulang direktori tempat file perang Anda akan dibongkar saat membuat dalam mode perang: meledak.
Anda dapat mempelajari tentang pengaturan plugin lainnya dari halaman resminya .
Membangun aplikasi web berdasarkan SpringBoot
Yah, saya ingin membongkar beberapa contoh perakitan nyata. Jangan sepele dan pertimbangkan ini menggunakan contoh aplikasi berdasarkan SpringBoot.
Langkah pertama. Buat proyek web Maven kosong dengan IDEA.
Langkah kedua. Tambahkan dependensi Spring ke pom.xml-nya.
<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>
Langkah ketiga. Buat kelas com.codegym.spring.MainController . Itu harus ditempatkan di folder src/main/Java :
@Controller
public class MainController {
@GetMapping("/")
public String viewIndexPage(Model model) {
model.addAttribute("header", "Maven Generate War");
return "index";
}
}
Ada 3 hal yang dijelaskan di sini. Pertama, anotasi @Controller memberi tahu kerangka kerja SpringBoot bahwa kelas ini akan digunakan untuk melayani permintaan web yang masuk.
Kedua, anotasi @GetMapping , menunjukkan bahwa metode kami akan dipanggil untuk melayani permintaan GET di root URI - /
Ketiga, metode mengembalikan string "index" . Ini memberitahu kerangka kerja SpringBoot untuk mengembalikan isi file index.html sebagai respon .
Langkah empat. Anda perlu menambahkan file index.html ke proyek dengan konten berikut:
<!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>
Bukan hanya html. Sebelum isinya diberikan ke klien, itu akan dimodifikasi di server oleh kerangka kerja Thymeleaf . Tag khusus disematkan dalam file ini, yang memungkinkan perpustakaan Thymeleaf memproses dan memodifikasi konten halaman.
Tag yang berwarna merah adalah tag yang akan diproses oleh library Thymeleaf, yang berwarna hijau adalah style dari library Bootstrap CSS.
Langkah lima. Atur plugin di pom.xml:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
Saya sedikit melebih-lebihkan kekuatan saya. Dibutuhkan banyak waktu untuk sepenuhnya mengurai contoh sederhana. Tetapi Anda dapat mengunduh kode lengkap proyek dari GitHub dan mencoba memahaminya sendiri. Omong-omong, 80% dari waktu kerja Anda, Anda akan melakukan hal itu :)
Anda dapat mengunduh kode lengkap dari tautan di GitHub .
GO TO FULL VERSION