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


  前言

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

  傳統部署: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-jar

 

  兩種方式

  jar

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

  我們通過創建一個完全自包含的可執行jar文件來完成我們的示例,該文件可以在生產環境中運行。可執行jar(有時稱為“胖jar”)是包含編譯類和代碼需要運行的所有jar依賴項的歸檔文件

  要創建一個可執行jar,我們需要將spring-boot-maven-plugin添加到我們的pom.xml中。為此,在dependencies部分下面插入以下幾行:

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

  如果需要制定jar包名稱、生成路徑,以及跳過測試

    <!--構建工具-->
    <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標簽

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

  

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

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

  后面改成絕對路徑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補充

  一、當我們打包后上傳Linux服務器,發現有些代碼還需要修改,重新打包、上傳又比較慢,如果只是少量代碼,並且是前端代碼、配置文件等,那么我們可以直接修改jar包內容

    1、先cd進到jar位置,然后使用 vim 命令進入jar包  

    

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

    

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

    PS:修改jar,重啟生效

 

  二、如果我們需要改動的是后端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

 

  將所有的東西都補全后還是報錯... 

 

 

  上網查了一下,說兩種問題:1、Tomcat問題,2、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:

  1、由於使用外部服務器,我們在項目的配置文件配置的server.port=10081已經沒有用了,端口信息需要咋Tomcat的server.xml進行配置

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

 

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

java.util.logging.ConsoleHandler.encoding = GBK

  3、為了安全,webapps只保留項目文件

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM