Mga pagkakaiba sa pagitan ng mga file ng digmaan at jar

Sa katunayan , ang isang jar library ay isang zip archive lamang, na direktang sumusunod sa pangalan nito: Java Archive . Kadalasan ito ay naglalaman lamang ng apat na bagay:

  • pinagsama-samang mga klase;
  • mga mapagkukunan: mga file ng pag-aari at mga katulad nito;
  • manifest MANIFEST.MF;
  • iba pang mga library ng jar (bihirang).

Ang karaniwang istraktura ng naturang archive ay ganito ang hitsura:

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

Ngayon tingnan natin ang isang tipikal na file ng digmaan. Sa pamamagitan ng paraan, ang digmaan ay hindi mula sa salitang digmaan, ngunit mula sa W eb Ar chive . Ang istraktura ng isang file ng digmaan ay karaniwang mas kumplikado. Kadalasan ito ay binubuo ng dalawang bahagi:

  • bahagi ng Java
    • pinagsama-samang mga klase
    • mga mapagkukunan para sa mga klase ng java: mga file ng pag-aari at mga katulad nito
    • iba pang mga jar library (madalas)
    • manifest MANIFEST.MF
  • bahagi ng web
    • web-xml - descriptor ng deployment ng serbisyo sa web
    • jsp servlets
    • static na mapagkukunan ng web: HTML, CSS, JS file

Isang halimbawa ng isang tipikal na file ng digmaan:

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

Mahalaga! Ang jar file ay maaaring patakbuhin sa pamamagitan lamang ng isang java machine, ngunit upang magpatakbo ng isang war file, dapat itong i-upload sa isang web server. Hindi ito nagsisimula sa sarili nitong.

war file plugin na may maven-war-plugin

Isipin natin na mayroon tayong simpleng proyekto sa web. Hayaang bigyan ang proyekto ng ganoong istraktura ng file, paano natin ito ibubuo?

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

Una, kailangan nating sabihin kay Maven na buuin ang lahat ng ito bilang war file , mayroong <package> tag para dito , halimbawa:

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

Pangalawa, kailangan nating isama ang maven-war-plugin plugin . Halimbawa:

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

Dito ay tinukoy lang namin ang isang plugin na maaaring i-configure sa hinaharap. Gayundin, gamit ang webappDirectory tag , tinutukoy namin muli ang direktoryo kung saan idi-deploy ang proyekto. Ngayon sasabihin ko sa iyo ang higit pa tungkol sa kung ano ang aking pinag-uusapan.

Maaaring itakda ang plugin sa dalawang build mode (dalawang uri ng layunin):

  • digmaan: digmaan
  • digmaan: sumabog

Sa unang kaso, ang resultang war file ay inilalagay lamang sa target na folder at pinangalanang <artifactId>-<version>.war .

Ngunit maaari mong "itanong" ang plugin upang ang mga nilalaman ng war file ay mailagay sa panghuling folder sa estado kung saan ito ay i-unpack ng web server sa loob. Para dito, ginagamit ang goal war:exploded .

Ang pangalawang diskarte ay kadalasang ginagamit kung ikaw ay nagpapatakbo o nagde-debug ng isang proyekto nang direkta mula sa Intellij IDEA.

Siyanga pala, binibigyang-daan ka ng webappDirectory tag sa halimbawa sa itaas na tukuyin muli ang direktoryo kung saan maa-unpack ang iyong war file kapag bumubuo sa war:exploded mode.

Maaari mong malaman ang tungkol sa iba pang mga setting ng plugin mula sa opisyal na pahina nito .

Pagbuo ng isang web application batay sa SpringBoot

Buweno, gusto kong i-disassemble ang ilang tunay na halimbawa ng pagpupulong. Huwag tayong maging maliit at isaalang-alang ito gamit ang isang halimbawang application batay sa SpringBoot.

Unang hakbang. Gumawa ng walang laman na proyekto sa web ng Maven gamit ang IDEA.

Ikalawang hakbang. Magdagdag ng mga dependency ng Spring sa pom.xml nito.

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

Ikatlong hakbang. Lumikha ng isang klase com.codegym.spring.MainController . Kailangan itong ilagay sa src/main/java folder :

@Controller
public class MainController {

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

Mayroong 3 bagay na inilarawan dito. Una, ang @Controller annotation ay nagsasabi sa SpringBoot framework na ang klase na ito ay gagamitin upang maghatid ng mga papasok na kahilingan sa web.

Pangalawa, ang @GetMapping annotation , ay nagpapahiwatig na ang aming pamamaraan ay tatawagin upang magsilbi ng isang kahilingan sa GET sa root URI - /

Pangatlo, ibinabalik ng pamamaraan ang string na "index" . Sinasabi nito sa SpringBoot framework na ibalik ang mga nilalaman ng index.html file bilang tugon .

Ikaapat na hakbang. Kailangan mong magdagdag ng index.html file sa proyekto na may sumusunod na nilalaman:

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

Ito ay hindi lamang html. Bago ibigay ang nilalaman nito sa kliyente, babaguhin ito sa server ng Thymeleaf framework . Ang mga espesyal na tag ay naka-embed sa file na ito, na nagpapahintulot sa Thymeleaf library na iproseso at baguhin ang nilalaman ng pahina.

Ang mga tag na pula ay ang mga tag na ipoproseso ng Thymeleaf library, ang berde ay ang mga istilo ng Bootstrap CSS library.

Ikalimang hakbang. Itakda ang plugin sa pom.xml:

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

Medyo nasobrahan ko ang lakas ko. Kailangan ng maraming oras upang ganap na mai-parse ang isang simpleng halimbawa. Ngunit maaari mong i-download ang buong code ng proyekto mula sa GitHub at subukang maunawaan ito mismo. Oo nga pala, 80% ng iyong oras sa pagtatrabaho ay gagawin mo iyon :)

Maaari mong i-download ang buong code mula sa link sa GitHub .