SpringBoot系列——jar包與war包的部署

  前言

  Spring Boot支持傳統部署和更現代的部署形式。jar跟war都支持,這裏參考springboot參考手冊學習記錄html

  傳統部署:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-traditional-deployment.html前端

  更現代的部署:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#getting-started-first-application-executable-jarjava

 

  兩種方式

  jar

  springboot項目支持建立可執行Jar,參考手冊第11.5. Creating an Executable Jar就有對這樣的介紹,我這裏充當一回搬運工(你們好,我是大天然勤勞的搬運工~~):mysql

  咱們經過建立一個徹底自包含的可執行jar文件來完成咱們的示例,該文件能夠在生產環境中運行。可執行jar(有時稱爲「胖jar」)是包含編譯類和代碼須要運行的全部jar依賴項的歸檔文件linux

  要建立一個可執行jar,咱們須要將spring-boot-maven-plugin添加到咱們的pom.xml中。爲此,在dependencies部分下面插入如下幾行:git

    <!--構建工具-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

  若是須要制定jar包名稱、生成路徑,以及跳過測試github

    <!--構建工具-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 文件名以及輸出路徑-->
                <configuration>
                    <finalName>${project.artifactId}</finalName>
                    <outputDirectory>../package</outputDirectory>
                </configuration>
            </plugin>

            <!-- 跳過啓動測試 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

  若是是在父類的pom文件進行統一管理,而後子類引入父類,這須要加pluginManagement標籤web

    <!--構建工具-->
    <build>
        <pluginManagement>
...
</pluginManagement> </build>

  

  2019-08-23補充:以前打包都是一個多個工程管理,在父類的pom文件配置這個,打包會在目錄下面生成,由於用的是../packagespring

  最近打包一個單獨的項目,路徑我改爲package,沒有../了,打包後並無在項目下面生成package目錄,jar不知道打去哪了。。。我全局搜也搜不出來sql

  後面改爲絕對路徑F:/package,終於有jar包了,但文件名不對,咱們明明設置讀取的是${project.artifactId},但打出來仍是帶上了版本號。。。,緣由暫時未知

 

 

 

  可使用命令行來打包,或者使用Maven Projects來打包

  打包成功,在target目錄下就會看到jar包

  要運行該應用程序,cmd命令,進入到jar所在路徑文件,使用 java -jar 命令;win下直接雙擊用java方式打開便可運行(Ctrl+C退出)

   那麼Linux下面如何部署運行呢?

=====Linux部署命令======
0、查看運行的項目 pgrep java | xargs ps 1、先kill掉舊服務 pkill -f myspringboot-0.0.1-SNAPSHOT 2、後臺啓動新服務(nohup後臺運行,&後臺運行的區別: 使用nohup運行程序: 結果默認會輸出到nohup.out 使用Ctrl + C發送SIGINT信號,程序關閉 關閉session發送SIGHUP信號,程序免疫 使用&後臺運行程序: 結果會輸出到終端 使用Ctrl + C發送SIGINT信號,程序免疫 關閉session發送SIGHUP信號,程序關閉 ) nohup java -jar /home/myspringboot/myspringboot-0.0.1-SNAPSHOT.jar & 如需輸出日誌 nohup java -jar /home/myspringboot/myspringboot-0.0.1-SNAPSHOT.jar > /home/myspringboot/myspringboot-0.0.1-SNAPSHOT.log & 3、查看日誌 tail -f /home/myspringboot/myspringboot-0.0.1-SNAPSHOT.log

 

  2019-07-08補充

  1、當咱們打包後上傳Linux服務器,發現有些代碼還須要修改,從新打包、上傳又比較慢,若是隻是少許代碼,而且是前端代碼、配置文件等,那麼咱們能夠直接修改jar包內容

    一、先cd進到jar位置,而後使用 vim 命令進入jar包  

    

    二、使用 / 命令模糊搜索定位文件,例如main.js  

    

    三、按回車進入文件,修改完成後使用 :wq 保存退出文件,回到jar包目錄,使用 :q 退出jar包,便可成功修改文件內容

    PS:修改jar,重啓生效

 

  2、若是咱們須要改動的是後端java代碼,那麼我就須要在本地改好後從新編譯代碼,把對應的java、class文件都替換到jar包

 

   war

  springboot項目支持建立一個可部署的War文件,參考手冊第92.1 Create a Deployable War File就有對這樣的介紹,我這裏充當一回搬運工(你們好,我是大天然勤勞的搬運工~~):

  因爲Spring WebFlux並不嚴格依賴於Servlet API,而且應用程序默認部署在嵌入式反應器Netty服務器上,因此WebFlux應用程序不支持War部署。

  生成可部署war文件的第一步是提供SpringBootServletInitializer子類並覆蓋其配置方法。這樣作能夠利用Spring Framework的Servlet 3.0支持,讓您在Servlet容器啓動應用程序時配置它。一般,您應該更新應用程序的主類以擴展SpringBootServletInitializer,同時,要將Spring應用程序部署到外部服務器,必須確保servlet初始化器直接實現WebApplicationInitializer(即便是從已經實現它的基類擴展而來)。以下例所示:

@SpringBootApplication
public class MyspringbootApplication  extends SpringBootServletInitializer implements WebApplicationInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyspringbootApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MyspringbootApplication.class, args);
    }
}

 

  在建立springboot項目時,默認是jar包,若是是想要打成war包,須要修改pom.xml,打包方式跟生成路徑跟jar的同樣,過程的最後一步是確保嵌入的servlet容器不會干擾部署war文件的servlet容器。爲此,須要將嵌入式servlet容器依賴項標記爲所提供的。

<!--默認jar-->
<packaging>war</packaging>

<!-- 如需打成war包 確保嵌入的servlet容器不會干擾部署war文件的servlet容器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

<!--構建工具-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

 

  獲得war包後把它丟到服務容器裏(放在webapps文件夾下)run起來就好了,要注意的是使用了外部容器,要記得改Tomcat的端口,在server.xml的Connector節點

 

  友情翻譯:若是使用Spring引導構建工具,將嵌入的servlet容器依賴項標記爲提供,將生成一個可執行的war文件,並將提供的依賴項打包在lib提供的目錄中。這意味着,除了能夠部署到servlet容器以外,還能夠在命令行上使用java -jar運行應用程序。

 

  後記

  打成war包丟到服務器裏面運行啓動報錯,還不知道是什麼問題,都是照着參考手冊來的...,先記錄到這裏;推薦直接使用jar的方式運行,war報錯的緣由,有空再去研究。

  

  補充

  2019-06-24補充:我將咱們前面寫的IM系統按照步驟打成war包,但啓動Tomcat報錯

 

  2019-07-12補充,後面看文檔後發現,咱們漏了一下東西,若是使用Logback,還須要告訴WebLogic選擇打包版本,而不是預先安裝在服務器上的版本。而SpringBoot默認使用Logback,同時,以前咱們也漏了 implements WebApplicationInitializer

 

  將全部的東西都補全後仍是報錯... 

 

 

  上網查了一下,說兩種問題:一、Tomcat問題,二、jar包問題

  咱們以前的Tomcat版本是apache-tomcat-7.0.53,去官網看來下,只支持6 and later(7 and later for WebSocket)

  但咱們項目用的jdk版本是1.8.0_131,須要9.0.x版的Tomcat才支持,直接下載最新版Tomcat

  成功啓動

 

 

  PS:

  一、因爲使用外部服務器,咱們在項目的配置文件配置的server.port=10081已經沒有用了,端口信息須要咋Tomcat的server.xml進行配置

    <Connector port="10081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8"/>

 

  二、解決Tomcat中文亂碼,修改conf/logging.properties

java.util.logging.ConsoleHandler.encoding = GBK

  三、爲了安全,webapps只保留項目文件

  四、Tomcat的本質是文件夾,默認配置下訪問項目要加war包名稱,例如: :端口/war包名/路徑

    這是由於咱們server.xml的host節點的默認appBase="webapps"

    

    新增一個默認訪問路徑就能夠不用加war包名稱了,例如:

    

     而後就能夠這樣訪問了

     

  到這裏war包啓動報錯的問題終於解決!

 

  2019-08-26補充:補充一下如何雲安裝java的jdk,以及mysql數據庫,這裏主要參考如下博客文章(親測可用):

  linux在線安裝JDK(1.8版本):https://blog.csdn.net/zxb730916/article/details/80899429?tdsourcetag=s_pctim_aiomsg

  Linux之yum安裝MySQL:https://www.jianshu.com/p/136003ffce41

 

  jdk

//查看是否已安裝JDK,卸載
yum list installed |grep java  

//卸載CentOS系統Java環境
//         *表時卸載全部openjdk相關文件輸入  
yum -y remove java-1.8.0-openjdk*
//         卸載tzdata-java  
yum -y remove tzdata-java.noarch

//列出java環境安裝包
yum -y list java*    

// 安裝JDK,若是沒有java-1.8.0-openjdk-devel就沒有javac命令 
yum  install  java-1.8.0-openjdk   java-1.8.0-openjdk-devel

  使用 java -version 查看版本號確認是否安裝成功

 

  mysql

  下載、安裝

//下載
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

//安裝
yum -y install mysql57-community-release-el7-10.noarch.rpm

yum -y install mysql-community-server

  啓動、配置

//啓動
systemctl start  mysqld.service

//查看root初始密碼
grep "password" /var/log/mysqld.log

//使用root登陸mysql
mysql -uroot -p  

//設置安全級別
set global validate_password_policy=0

//默認密碼長度爲8,能夠設置爲其它值,最小4位
set global validate_password_length=4

//修改root密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

//可視化工具的登陸受權:(若是受權不成功,請查看防火牆)
grant all on *.* to root@'%' identified by 'root';

  配置到這裏就可使用數據庫工具去鏈接操做數據庫了

 

  代碼開源

  代碼已經開源、託管到個人GitHub、碼雲:

  GitHub:https://github.com/huanzi-qch/springBoot

  碼雲:https://gitee.com/huanzi-qch/springBoot

相關文章
相關標籤/搜索