首先給大家來講一個我們遇到的一個奇怪的問題:
我的一個springboot項目,用mvn install打包成jar,換一臺有jdk的機器就直接可以用java -jar 項目名.jar的方式運行,沒任何問題,為什么這里不需要tomcat也可以運行了?
然后我打包成war放進tomcat運行,發(fā)現(xiàn)端口號變成tomcat默認的8080(我在server.port中設置端口8090)項目名稱也必須加上了。
也就是說我在原來的機器的IDEA中運行,項目接口地址為 ip:8090/listall,打包放進另一臺機器的tomcat就變成了ip:8080/項目名/listall。這又是為什么呢?
通過jar運行實際上是啟動了內(nèi)置的tomcat,所以用的是應用的配置文件中的端口
直接部署到tomcat之后,內(nèi)置的tomcat就不會啟用,所以相關配置就以安裝的tomcat為準,與應用的配置文件就沒有關系了
哎,現(xiàn)在學編程的基本都不會教歷史了,也沒人有興趣去鉆研。
總體來說吧,很多年前,Sun 還在世的那個年代,在度過了早期用 C++寫 Html 解析器的蠻荒時期后,有一批最早的腳本程序進入了 cgi 時代,此時的 Sun 決定進軍這個領域,為了以示區(qū)別并顯得自己高大上,于是研發(fā)了 servlet 標準,搞出了最早的 jsp。并給自己起了個高大上的稱號 JavaEE ( Java 企業(yè)級應用標準,其實不就是一堆服務器以 http 提供服務嗎,吹逼)。
既然是企業(yè)級標準那自然得有自己的服務器標準。于是 Servlet 標準誕生,以此標準實現(xiàn)的服務器稱為 Servle 容器服務器,Tomcat 就是其中代表,被 Sun 捐獻給了 Apache 基金會,那個時候的 Web 服務器還是個高大上的概念,當時的 Java Web 程序的標準就是 War 包(其實就是個 Zip 包),這就是 War 包的由來。
后來隨著服務器領域的屢次進化,人們發(fā)現(xiàn)我們?yōu)槭裁匆@么笨重的 Web 服務器,還要實現(xiàn)一大堆 Servlet 之外的管理功能,簡化一下抽出核心概念 servlet 不是更好嗎,最早這么干的似乎是 Jetty,出現(xiàn)了可以內(nèi)嵌的 Servelet 服務器。
去掉了一大堆非核心功能。后來 tomcat 也跟進了,再后來,本來很笨重的傳統(tǒng) JavaEE 服務器 Jboss 也搞了個 undertow 來湊熱鬧。正好這個時候微服務的概念興起,“ use Jar,not War ”。要求淘汰傳統(tǒng) Servlet 服務器的呼聲就起來了。
jar包和war包的區(qū)別
1、war是一個web模塊,其中需要包括WEB-INF,是可以直接運行的WEB模塊;jar一般只是包括一些class文件,在聲明了Main_class之后是可以用java命令運行的。
2、war包是做好一個web應用后,通常是網(wǎng)站,打成包部署到容器中;jar包通常是開發(fā)時要引用通用類,打成包便于存放管理。
3、war是Sun提出的一種Web應用程序格式,也是許多文件的一個壓縮包。這個包中的文件按一定目錄結構來組織;classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)可以打包成jar放到WEB-INF下的lib目錄下。
JAR文件格式以流行的ZIP文件格式為基礎。與ZIP文件不同的是,JAR 文件不僅用于壓縮和發(fā)布,而且還用于部署和封裝庫、組件和插件程序,并可被像編譯器和 JVM 這樣的工具直接使用。
【格式特點】:
安全性可以對 JAR 文件內(nèi)容加上數(shù)字化簽名。這樣,能夠識別簽名的工具就可以有選擇地為您授予軟件安全特權,這是其他文件做不到的,它還可以檢測代碼是否被篡改過。
減少下載時間如果一個 applet 捆綁到一個 JAR 文件中,那么瀏覽器就可以在一個 HTTP 事務中下載這個 applet 的類文件和相關的資源,而不是對每一個文件打開一個新連接。
壓縮JAR 格式允許您壓縮文件以提高存儲效率。
傳輸平臺擴展Java 擴展框架(Java Extensions Framework)提供了向 Java 核心平臺添加功能的方法,這些擴展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 開發(fā)的擴展例子)。
WAR文件就是一個Web應用程序,建立WAR文件,就是把整個Web應用程序(不包括Web應用程序層次結構的根目錄)壓縮起來,指定一個war擴展名。
【建立的條件】:
需要建立正確的Web應用程序的目錄層次結構。
建立WEB-INF子目錄,并在該目錄下建立classes與lib兩個子目錄。
將Servlet類文件放到WEB-INFclasses目錄下,將Web應用程序所使用Java類庫文件(即JAR文件)放到WEB-INFlib目錄下。
將JSP頁面或靜態(tài)HTML頁面放到上下文根路徑下或其子目錄下。
建立META-INF目錄,并在該目錄下建立context.xml文件。
下面給大家講講怎么將springboot項目打包成jar和war
SpringBoot項目打包成jar很簡單,也是SpringBoot的常用打包格式;本篇博客將SpringBoot打包成jar和war兩種方式都記錄下來;
先介紹將SpringBoot打包成jar包的方式:(以下示例是在idea中演示)
一、打包成jar
1)先new 一個Spring Starter Project
這里注意packaging默認為jar,不用修改.
2)創(chuàng)建完成后項目的pom如下:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.4.RELEASE com.example demo 0.0.1-SNAPSHOT demo DemoprojectforSpringBoot 1.8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
3)打成jar包(通過maven命令的方式):
在Terminal窗口,使用mvn clean package命令打包:
然后在target目錄下就能看到打包好的jar包了
二、打包成war包形式
1)可以在剛才創(chuàng)建的項目上做改動,首先打包成war需要一個ServletInitializer類,這個類的位置需要和啟動類在同一個文件下
如果一開始選擇war包形式,會自動創(chuàng)建此類
2)修改pom.xml
修改pom.xml的war將原先的jar改為war;
3)如果我們的SpringBoot是使用html作為前端頁面開發(fā)沒有問題,但是如果我們想用jsp開發(fā),這個時候就需要配置一些依賴了:主要是排除SpringBoot的內(nèi)置Tomcat,添加javax.servlet-api和tomcat-servlet-api(SpringMVC還需要配置后綴);
最后的pom.xml如下:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.4.RELEASE com.example demo 0.0.1-SNAPSHOT war demo DemoprojectforSpringBoot 1.8 org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-tomcat javax.servlet javax.servlet-api provided org.apache.tomcat tomcat-servlet-api 8.0.36 provided org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat provided org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
因為SpringBoot默認推薦的是html,而不是jsp;經(jīng)過上面的修改就可以使用jsp進行開發(fā)了;
4)打包成war:使用mvn clean package
如下:
打包成功后,就可以將war包放在tomcat下的webapps下,然后運行tomcat,啟動項目了;
記錄下來,以后用到的時候看 ^_^;
當然了,在創(chuàng)建項目的時候直接選擇package為war,直接就能打成war包了
當選擇war為打包方式創(chuàng)建項目時,ServletInitializer是默認直接創(chuàng)建的
此時,pom文件如下
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.4.RELEASE com.example demo 0.0.1-SNAPSHOT war demo DemoprojectforSpringBoot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat provided org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
直接mvn clean package就能打包成功
審核編輯:劉清
-
JAVA
+關注
關注
19文章
2976瀏覽量
105220 -
Web服務器
+關注
關注
0文章
138瀏覽量
24492 -
JSP技術
+關注
關注
0文章
3瀏覽量
1602 -
SpringBoot
+關注
關注
0文章
174瀏覽量
201
原文標題:SpringBoot 部署打包成 jar 和 war 有什么不同?
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
SpringBoot 如何實現(xiàn)熱部署
![<b class='flag-5'>SpringBoot</b> 如何實現(xiàn)熱<b class='flag-5'>部署</b>](https://file1.elecfans.com/web2/M00/A5/66/wKgaomUKuHiAYRDvAAQANEd7s2I637.jpg)
關于JAVA不能打包成jar包的問題
請問如何打jar包和運行jar包?
Linux部署maven(war包)web 項目
基于Linux的Maven的自動化打包發(fā)布項目
基于spring boot的linux服務器部署方法
如何將LUbuntu系統(tǒng)的根文件系統(tǒng)打包成img呢
怎樣通過QEMU模擬器加載系統(tǒng)文件打包成新的roofts鏡像呢
jar與war之間不得不說的事
![<b class='flag-5'>jar</b>與<b class='flag-5'>war</b>之間不得不說的事](https://file1.elecfans.com//web2/M00/A7/13/wKgZomUMQjmAKmMTAAAP_mX_7N8140.jpg)
評論