環境
系統:centos7 64位
安裝jdk
第一步:下載
先進入官網:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
方法一:下載安裝包到本地,再上傳到服務器
根據系統選擇相應版本,服務器是centos7 64位的,所以選擇下載linux x64的安裝包
下載成功后,使用xtfp 5將安裝包上傳到/usr/local(根據自己習慣,選擇目錄)目錄下
方法二:wget下載
復制安裝包下載路徑:
執行wget命令:
wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
如下圖所示:
第一種下載方法要先下載到本地,再使用工具上傳到centos7服務器上, 比較耗時,推薦使用wget方式來下載安裝包。
第二步:解壓
切換到安裝包保存目錄:
cd /usr/local/
解壓到當前目錄:
tar -zxvf jdk-8u161-linux-x64.tar.gz
第三步:配置環境變量
打開系統環境變量配置文件:
vim /etc/profile
在profile文件末尾加上如下內容:
## JAVA JAVA_HOME=/usr/local/jdk1.8.0_161 JRE_HOME=/usr/local/jdk1.8.0_161/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export JAVA_HOME JRE_HOME PATH CLASSPATH
輸入:wq保存退出。
第四步:配置文件生效
為了使得配置文件立即生效,執行如下命令
source /etc/profile
第五步:測試jdk是否安裝成功
查看jdk版本信息:
java -version
控制台輸出如下信息,表示安裝成功:
安裝tomcat
第一步:下載
tomcat下載方式與jdk下載方式類似,也是有兩種方法。
先進入tomcat官網:https://tomcat.apache.org/download-80.cgi
方法一:先從官網下載到本地,再上傳到服務器
選擇下載tomcat8.5.30版本,如下圖:
下載成功后,使用xtfp 5將安裝包上傳到/usr/local(根據自己習慣,選擇目錄)目錄下
方法二:wget下載
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.30/bin/apache-tomcat-8.5.30.tar.gz
第二步:解壓
切換到tomcat下載目錄:
cd /usr/local
解壓到當前目錄:
tar -zxvf apache-tomcat-8.5.30.tar.gz
第三步:啟動
切換到解壓后的tomcat的bin目錄下:
cd /usr/local/apache-tomcat-8.5.30/bin
執行啟動命令:
./startup.sh
查看tomcat啟動日志:
tail -f ../logs/catalina.out
發現啟動耗時太長,解決方法可參考此篇文章:https://blog.csdn.net/u013939884/article/details/72860358
我自己是通過修改JRE中的java.security文件為 securerandom.source=file:/dev/urandom來解決該問題。
第四步:測試
訪問網址:http://ip:8080/,訪問時將ip替換為自己的服務器ip,出現如下畫面,表示tomcat啟動成功。
備注:如果tomcat啟動成功,但是該頁面又訪問不了,請檢查8080端口是否開放。
演示項目
以下部署方式均基於maven構建的springboot項目,項目名稱springboot-helloworld,開發工具為IntelliJ IDEA,以下檢查為idea。
項目目錄結構
代碼
ServletInitializer類:該類用於已tomcat方式啟動springboot
package com.lnjecit.springboothelloworld; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringbootHelloworldApplication.class); } }
HelloWorldController類:
package com.lnjecit.springboothelloworld.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author * @create 2018-04-16 16:06 **/ @RequestMapping("/helloWorld") @RestController public class HelloWorldController { @RequestMapping("/sayHello") public String sayHello(@RequestParam("name") String name) { return "Hi, " + name; } }
以war包方式部署
步驟:
第一步:將項目打包方式修改為war
第二步:在idea中Terminal控制台執行maven打包命令
mvn clean package -Dmaven.test.skip=true
命令執行完畢后,在target目錄下生成了war包,如下圖:
第三步:使用xftp將war包上傳到服務器/usr/local/apache-tomcat-8.5.30/webapps目錄下
先將該目錄下的ROOT目錄刪除,然后將springboot-helloworld-0.0.1-SNAPSHOT.war重命名為ROOT.war
第四步:啟動tomcat
第五步:測試
在瀏覽器中輸入:http://ip:8080/helloWorld/sayHello?name=李白 ip改為自己服務器的ip
到這里就部署成功了。
但是這樣每次以war包方式打包,war包比較大,我們解壓解壓之后,可以看到文件總共13.7M,lib包也是13.7M,而classes文件夾只有2.69kb
可以看到lib包的大小占到了90%以上,實際代碼容量非常小,每次都重新打war包,實際上是比較麻煩的,也沒有必要。所以在部署實際項目的時候,如果決定要以war包方式部署項目,我通常在pom依賴沒有改變的時候,只會將項目target目錄下的classes目錄覆蓋服務器上的classes目錄即可,如下圖:
這樣可以大幅度的提升項目部署速度,尤其是在網速比較慢的時候。
只有當pom依賴有改動,才重新打一個完整的war包部署到服務器上。
以jar包方式部署
完整jar包
第一步:將項目打包方式修改為jar
第二步:在idea中Terminal控制台執行maven打包命令
mvn clean package -Dmaven.test.skip=true
命令執行完畢后,在target目錄下生成了jar包,如下圖:
第三步:使用xftp將jar包上傳到服務器/usr/local/springboot-helloworld目錄下
第四步:運行jar包
先切換到jar包所在目錄:
cd /usr/local/springboot-helloworld/
運行jar:
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar
出現如下信息表示啟動成功:
第五步:測試
在瀏覽器中輸入:http://ip:8080/helloWorld/sayHello?name=李白 ip改為自己服務器的ip
到這里就部署成功了。
缺點:
1、打包后,配置文件和依賴包都在jar包內部,配置文件無法修改。而實際項目中,開發環境的配置與服務器環境配置並不完全一致,例如數據庫信息,日志信息保存路徑等,想要修改配置文件也無法修改
2、項目依賴包一般不會有變化,但是每次打包都會把依賴包打包到jar包內
3、控制台頁面一關閉,springboot服務也關閉
Jar包、配置文件、依賴包分開打包
由於每次以jar包方式部署會有上面說的缺點,為了解決這些問題,可以將jar包、配置文件、依賴包分開打包。分開打包后,有如下好處:
1、可以實現當依賴包有變化時,才重新打包依賴包
2、配置文件也可以修改
3、由於依賴包和jar包分離,可以減少jar文件大小。jar文件減少,可以縮短上傳到服務器的時間
第一步: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> <groupId>com.lnjecit</groupId> <artifactId>springboot-helloworld</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-helloworld</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <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-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!--<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <excludes> <exclude>*.properties</exclude> <exclude>*.yml</exclude> </excludes> <archive> <manifest> <!-- 為依賴包添加路徑, 這些路徑會寫在MANIFEST文件的Class-Path下 --> <mainClass>com.lnjecit.springboothelloworld.SpringbootHelloworldApplication</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!-- 打包時 MANIFEST.MF文件不記錄的時間戳版本 --> <useUniqueVersions>false</useUniqueVersions> </manifest> <manifestEntries> <!-- 在Class-Path下添加配置文件的路徑 --> <Class-Path>config/</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-xmls</id> <phase>process-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/config</outputDirectory> <resources> <resource> <directory>${basedir}/src/main/resources</directory> <includes> <include>*.properties</include> <include>*.yml</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>target/lib/</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
第二步:在idea中Terminal控制台執行maven打包命令
mvn clean package -Dmaven.test.skip=true
命令執行完畢后,在target目錄下生成了jar包、config、lib三部分,如下圖:
第三步:使用xftp將jar包上傳到服務器/usr/local/springboot-helloworld/deploy目錄下
第四步:運行jar包
先切換到jar包所在目錄:
cd /usr/local/springboot-helloworld/deploy/
springboot默認啟動端口為8080,為了測試分開打包后可以修改配置文件,在application.properties文件中修改啟動端口為8081
運行jar:
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar
在控制台可以看到啟動端口變成了8081,如下圖:
測試:
在瀏覽器中輸入:http://ip:8081/helloWorld/sayHello?name=阿飛 ip改為自己服務器的ip
demo下載地址:https://github.com/linj6/springboot-learn/tree/master/springboot-helloworld
以jar包方式啟動還有一個問題,當springboot服務啟動端口關閉,服務也停止了。后面介紹將springboot設置為后台服務,啟動窗口關閉后,服務依然運行。
Jar包運行
普通運行
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar
指定端口運行
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --server.port=8082
后台運行
方法一:
nohup java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar &
啟動后再當前目錄生成一個nohup.out文件
查看啟動后的服務:
ps -ef | grep java
關閉服務:
kill -9 3730
方法二:
nohup java -jar demo.jar & > log.file 2>&1 &
springboot項目部署方式介紹完了,個人推薦使用將jar、配置文件、依賴包分開打包的方式來部署項目。