Savaş ve jar dosyaları arasındaki farklar

Aslında , bir jar kitaplığı yalnızca bir zip arşividir ve doğrudan adından gelir: Java Archive . Çoğu zaman sadece dört şey içerir:

  • derlenmiş sınıflar;
  • kaynaklar: özellikler dosyaları ve benzerleri;
  • manifest MANIFEST.MF;
  • diğer kavanoz kütüphaneleri (nadir).

Böyle bir arşivin tipik yapısı şöyle görünür:

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

Şimdi tipik bir savaş dosyasına bakalım. Bu arada war kelimesi de war kelimesinden değil WebArşiv'den gelmektedir . Bir savaş dosyasının yapısı genellikle daha karmaşıktır. Çoğu zaman iki bölümden oluşur:

  • Java bölümü
    • derlenmiş sınıflar
    • java sınıfları için kaynaklar: özellikler dosyaları ve benzerleri
    • diğer jar kütüphaneleri (sıklıkla)
    • manifest MANIFEST.MF
  • web bölümü
    • web-xml - web hizmeti dağıtım tanımlayıcısı
    • jsp sunucu uygulamaları
    • statik web kaynakları: HTML, CSS, JS dosyaları

Tipik bir savaş dosyası örneği:

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

Önemli! jar dosyası sadece bir java makinesi tarafından çalıştırılabilir, ancak bir savaş dosyasını çalıştırmak için bir web sunucusuna yüklenmesi gerekir. Kendi kendine başlamaz.

maven-war-plugin ile savaş dosyası eklentisi

Basit bir web projemiz olduğunu düşünelim. Projeye böyle bir dosya yapısı verilsin, onu nasıl birleştiririz?

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

Öncelikle, Maven'e tüm bunları bir savaş dosyası olarak oluşturmasını söylemeliyiz , bunun için bir <package> etiketi var , örneğin:

	<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>

İkincisi, maven-war-plugin eklentisini eklememiz gerekiyor . Örnek:

  <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>

Burada, gelecekte yapılandırılabilecek bir eklenti tanımlıyoruz. Ayrıca webappDirectory etiketini kullanarak projenin konuşlandırılacağı dizini yeniden tanımlarız. Şimdi size neden bahsettiğim hakkında daha fazla bilgi vereceğim.

Eklenti iki derleme moduna ayarlanabilir (iki tür hedef):

  • savaş: savaş
  • savaş:patladı

İlk durumda, elde edilen war dosyası hedef klasöre yerleştirilir ve <artifactId>-<version>.war olarak adlandırılır .

Ancak eklentiye, savaş dosyasının içeriğinin, içindeki web sunucusu tarafından paketinden çıkarılacağı durumda son klasöre yerleştirilmesini "sorabilirsiniz". Bunun için de goal war:exploded kullanılır .

Doğrudan Intellij IDEA'dan bir proje çalıştırıyor veya hata ayıklıyorsanız ikinci yaklaşım sıklıkla kullanılır.

Bu arada, yukarıdaki örnekteki webappDirectory etiketi , war:exploded modunda oluştururken war dosyanızın açılacağı dizini yeniden tanımlamanıza olanak tanır.

Diğer eklenti ayarları hakkında resmi sayfasından bilgi edinebilirsiniz .

SpringBoot tabanlı bir web uygulaması oluşturma

Pekala, bazı gerçek montaj örneklerini parçalarına ayırmak istiyorum. Önemsiz olmayalım ve bunu SpringBoot'a dayalı örnek bir uygulama kullanarak düşünelim.

Adım bir. IDEA ile boş bir Maven web projesi oluşturun.

İkinci adım. Yay bağımlılıklarını pom.xml dosyasına ekleyin.

<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>

Adım üç. Bir com.codegym.spring.MainController sınıfı oluşturun . src/main/java klasörüne yerleştirilmesi gerekir :

@Controller
public class MainController {

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

Burada açıklanan 3 şey var. İlk olarak, @Controller ek açıklaması, SpringBoot çerçevesine bu sınıfın gelen web isteklerini karşılamak için kullanılacağını söyler.

İkincisi, @GetMapping ek açıklaması , yöntemimizin kök URI'de bir GET isteğine hizmet vermek üzere çağrılacağını belirtir - /

Üçüncüsü, yöntem "index" dizesini döndürür . Bu, SpringBoot çerçevesine index.html dosyasının içeriğini bir yanıt olarak döndürmesini söyler .

Adım dört. Projeye aşağıdaki içeriğe sahip bir index.html dosyası eklemeniz gerekir:

<!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>

Sadece html değil. İçeriği istemciye verilmeden önce sunucu üzerinde Thymeleaf çerçevesi tarafından değiştirilecektir . Bu dosyaya, Thymeleaf kitaplığının sayfanın içeriğini işlemesine ve değiştirmesine izin veren özel etiketler yerleştirilmiştir.

Kırmızı olan etiketler Thymeleaf kitaplığı tarafından işlenecek olan etiketlerdir, yeşil olanlar Bootstrap CSS kitaplığının stilleridir.

Beşinci adım. Eklentiyi pom.xml'de ayarlayın:

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

Gücümü biraz abarttım. Basit bir örneği tamamen ayrıştırmak çok zaman alır. Ancak projenin tam kodunu GitHub'dan indirebilir ve kendiniz anlamaya çalışabilirsiniz. Bu arada, çalışma sürenizin %80'ini tam da bunu yapacaksınız :)

Kodun tamamını GitHub'daki bağlantıdan indirebilirsiniz .