<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot 部署打包成 jar 和 war 有什么不同?

          共 9313字,需瀏覽 19分鐘

           ·

          2023-03-07 23:56

          點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)

          來源:https://blog.csdn.net/weixin_40910372/


          首先給大家來講一個(gè)我們遇到的一個(gè)奇怪的問題:


          1.我的一個(gè)springboot項(xiàng)目,用mvn install打包成jar,換一臺有jdk的機(jī)器就直接可以用java -jar 項(xiàng)目名.jar的方式運(yùn)行,沒任何問題,為什么這里不需要tomcat也可以運(yùn)行了?


          2.然后我打包成war放進(jìn)tomcat運(yùn)行,發(fā)現(xiàn)端口號變成tomcat默認(rèn)的8080(我在server.port中設(shè)置端口8090)項(xiàng)目名稱也必須加上了。


          也就是說我在原來的機(jī)器的IDEA中運(yùn)行,項(xiàng)目接口地址為 ip:8090/listall,打包放進(jìn)另一臺機(jī)器的tomcat就變成了ip:8080/項(xiàng)目名/listall。這又是為什么呢?


          • 通過jar運(yùn)行實(shí)際上是啟動了內(nèi)置的tomcat,所以用的是應(yīng)用的配置文件中的端口


          • 直接部署到tomcat之后,內(nèi)置的tomcat就不會啟用,所以相關(guān)配置就以安裝的tomcat為準(zhǔn),與應(yīng)用的配置文件就沒有關(guān)系了


          哎,現(xiàn)在學(xué)編程的基本都不會教歷史了,也沒人有興趣去鉆研。



          總體來說吧,很多年前,Sun 還在世的那個(gè)年代,在度過了早期用 C++寫 Html 解析器的蠻荒時(shí)期后,有一批最早的腳本程序進(jìn)入了 cgi 時(shí)代,此時(shí)的 Sun 決定進(jìn)軍這個(gè)領(lǐng)域,為了以示區(qū)別并顯得自己高大上,于是研發(fā)了 servlet 標(biāo)準(zhǔn),搞出了最早的 jsp。并給自己起了個(gè)高大上的稱號 JavaEE ( Java 企業(yè)級應(yīng)用標(biāo)準(zhǔn),其實(shí)不就是一堆服務(wù)器以 http 提供服務(wù)嗎,吹逼)。


          既然是企業(yè)級標(biāo)準(zhǔn)那自然得有自己的服務(wù)器標(biāo)準(zhǔn)。于是 Servlet 標(biāo)準(zhǔn)誕生,以此標(biāo)準(zhǔn)實(shí)現(xiàn)的服務(wù)器稱為 Servle 容器服務(wù)器,Tomcat 就是其中代表,被 Sun 捐獻(xiàn)給了 Apache 基金會,那個(gè)時(shí)候的 Web 服務(wù)器還是個(gè)高大上的概念,當(dāng)時(shí)的 Java Web 程序的標(biāo)準(zhǔn)就是 War 包(其實(shí)就是個(gè) Zip 包),這就是 War 包的由來。


          后來隨著服務(wù)器領(lǐng)域的屢次進(jìn)化,人們發(fā)現(xiàn)我們?yōu)槭裁匆@么笨重的 Web 服務(wù)器,還要實(shí)現(xiàn)一大堆 Servlet 之外的管理功能,簡化一下抽出核心概念 servlet 不是更好嗎,最早這么干的似乎是 Jetty,出現(xiàn)了可以內(nèi)嵌的 Servelet 服務(wù)器。


          去掉了一大堆非核心功能。后來 tomcat 也跟進(jìn)了,再后來,本來很笨重的傳統(tǒng) JavaEE 服務(wù)器 Jboss 也搞了個(gè) undertow 來湊熱鬧。正好這個(gè)時(shí)候微服務(wù)的概念興起,“ use Jar,not War ”。要求淘汰傳統(tǒng) Servlet 服務(wù)器的呼聲就起來了。


          # jar包和war包的區(qū)別


          1、war是一個(gè)web模塊,其中需要包括WEB-INF,是可以直接運(yùn)行的WEB模塊;jar一般只是包括一些class文件,在聲明了Main_class之后是可以用java命令運(yùn)行的。


          2、war包是做好一個(gè)web應(yīng)用后,通常是網(wǎng)站,打成包部署到容器中;jar包通常是開發(fā)時(shí)要引用通用類,打成包便于存放管理。


          3、war是Sun提出的一種Web應(yīng)用程序格式,也是許多文件的一個(gè)壓縮包。這個(gè)包中的文件按一定目錄結(jié)構(gòu)來組織;classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)可以打包成jar放到WEB-INF下的lib目錄下。


          JAR文件格式以流行的ZIP文件格式為基礎(chǔ)。與ZIP文件不同的是,JAR 文件不僅用于壓縮和發(fā)布,而且還用于部署和封裝庫、組件和插件程序,并可被像編譯器和 JVM 這樣的工具直接使用。


          【格式特點(diǎn)】:


          • 安全性 可以對 JAR 文件內(nèi)容加上數(shù)字化簽名。這樣,能夠識別簽名的工具就可以有選擇地為您授予軟件安全特權(quán),這是其他文件做不到的,它還可以檢測代碼是否被篡改過。


          • 減少下載時(shí)間 如果一個(gè) applet 捆綁到一個(gè) JAR 文件中,那么瀏覽器就可以在一個(gè) HTTP 事務(wù)中下載這個(gè) applet 的類文件和相關(guān)的資源,而不是對每一個(gè)文件打開一個(gè)新連接。


          • 壓縮 JAR 格式允許您壓縮文件以提高存儲效率。


          • 傳輸平臺擴(kuò)展 Java 擴(kuò)展框架(Java Extensions Framework)提供了向 Java 核心平臺添加功能的方法,這些擴(kuò)展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 開發(fā)的擴(kuò)展例子)。

          WAR文件就是一個(gè)Web應(yīng)用程序,建立WAR文件,就是把整個(gè)Web應(yīng)用程序(不包括Web應(yīng)用程序?qū)哟谓Y(jié)構(gòu)的根目錄)壓縮起來,指定一個(gè)war擴(kuò)展名。


          【建立的條件】:


          • 需要建立正確的Web應(yīng)用程序的目錄層次結(jié)構(gòu)。

          • 建立WEB-INF子目錄,并在該目錄下建立classes與lib兩個(gè)子目錄。

          • 將Servlet類文件放到WEB-INF\classes目錄下,將Web應(yīng)用程序所使用Java類庫文件(即JAR文件)放到WEB-INF\lib目錄下。

          • 將JSP頁面或靜態(tài)HTML頁面放到上下文根路徑下或其子目錄下。

          • 建立META-INF目錄,并在該目錄下建立context.xml文件。


          下面給大家講講怎么將springboot項(xiàng)目打包成jar和war


          SpringBoot項(xiàng)目打包成jar很簡單,也是SpringBoot的常用打包格式;本篇博客將SpringBoot打包成jar和war兩種方式都記錄下來;


          先介紹將SpringBoot打包成jar包的方式:(以下示例是在idea中演示)


          # 打包成jar


          1)先new 一個(gè)Spring Starter Project



          這里注意packaging默認(rèn)為jar,不用修改.


          2)創(chuàng)建完成后項(xiàng)目的pom如下:


          <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.1.4.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description>  <properties>  <java.version>1.8</java.version> </properties>  <dependencies>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter</artifactId>  </dependency>   <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency> </dependencies>  <build>  <plugins>   <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>   </plugin>  </plugins> </build> </project>


          3)打成jar包(通過maven命令的方式):


          在Terminal窗口,使用 mvn clean package 命令打包:



          然后在target目錄下就能看到打包好的jar包了


          # 打包成war包形式


          1)可以在剛才創(chuàng)建的項(xiàng)目上做改動,首先打包成war需要一個(gè)ServletInitializer類,這個(gè)類的位置需要和啟動類在同一個(gè)文件下


          如果一開始選擇war包形式,會自動創(chuàng)建此類


          2)修改pom.xml


          修改pom.xml的war將原先的jar改為war;


          3)如果我們的SpringBoot是使用html作為前端頁面開發(fā)沒有問題,但是如果我們想用jsp開發(fā),這個(gè)時(shí)候就需要配置一些依賴了:主要是排除SpringBoot的內(nèi)置Tomcat,添加javax.servlet-api和tomcat-servlet-api(SpringMVC還需要配置后綴);


          最后的pom.xml如下:

          <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.1.4.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo</name> <description>Demo project for Spring Boot</description>  <properties>  <java.version>1.8</java.version> </properties>  <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>            <exclusions>                <exclusion>                    <groupId>org.springframework.boot</groupId>                    <artifactId>spring-boot-starter-tomcat</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <scope>provided</scope>        </dependency>         <dependency>            <groupId>org.apache.tomcat</groupId>            <artifactId>tomcat-servlet-api</artifactId>            <version>8.0.36</version>            <scope>provided</scope>        </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>   <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency> </dependencies>  <build>  <plugins>   <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>   </plugin>  </plugins> </build> </project>


          因?yàn)镾pringBoot默認(rèn)推薦的是html,而不是jsp;經(jīng)過上面的修改就可以使用jsp進(jìn)行開發(fā)了;


          4)打包成war:使用mvn clean package


          如下:


          打包成功后,就可以將war包放在tomcat下的webapps下,然后運(yùn)行tomcat,啟動項(xiàng)目了;


          記錄下來,以后用到的時(shí)候看 ^_^;

          當(dāng)然了,在創(chuàng)建項(xiàng)目的時(shí)候直接選擇package為war,直接就能打成war包了


          當(dāng)選擇war為打包方式創(chuàng)建項(xiàng)目時(shí),ServletInitializer是默認(rèn)直接創(chuàng)建的



          此時(shí),pom文件如下

          <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.1.4.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>demo</name> <description>Demo project for Spring Boot</description>  <properties>  <java.version>1.8</java.version> </properties>  <dependencies>  <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>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency> </dependencies>  <build>  <plugins>   <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>   </plugin>  </plugins> </build> </project>


          直接mvn clean package就能打包成功



            

          1、社區(qū)糾紛不斷:程序員何苦為難程序員?

          2、該死的單元測試,寫起來到底有多痛?

          3、互聯(lián)網(wǎng)人為什么學(xué)不會擺爛

          4、為什么國外JetBrains做 IDE 就可以養(yǎng)活自己,國內(nèi)不行?區(qū)別在哪?

          5、相比高人氣的Rust、Go,為何 Java、C 在工具層面進(jìn)展緩慢?

          6、讓程序員早點(diǎn)下班的《技術(shù)寫作指南》

          點(diǎn)

          點(diǎn)

          點(diǎn)點(diǎn)

          點(diǎn)在看

          瀏覽 64
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  jzzijzzij亚洲成熟少妇在线播放 | 北条麻妃一级婬片A片 | 性久久久久久久久久久久 | 尹人网午夜视频 | 草草影院网站 |