前言
Spring Boot支持傳統部署和更現代的部署形式。jar跟war都支持,這里參考springboot參考手冊學習記錄
兩種方式
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、碼雲: