搭建 Java 部署環境
JDK
1. 更新軟件包
apt 命令詳細介紹
sudo apt-get update
2. 安裝 OpenJDK
查找 JDK 包
apt list | grep "jdk"
安裝 JDK
sudo apt install openjdk-17-jdk
注意:
- 此處安裝的是 OpenJDK,OpenJDK 是一個開源版本的 JDK,和 Oracle 官方的 JDK 略有差別。此處我們就使用 OpenJDK 即可。安裝 Oracle JDK 比較麻煩。
- 使用
java -version
驗證是否安裝成功。 - 如果提示 “java 命令找不到” 則說明安裝失敗。
3. 卸載 OpenJDK
-
檢查安裝的是哪個 OpenJDK
dpkg --list | grep -i jdk
-
移除 OpenJDK 包
apt-get purge openjdk*
-
卸載 OpenJDK 相關包
apt-get purge icedtea-* openjdk-*
-
檢查所有 OpenJDK 包是否都已卸載完畢
dpkg --list | grep -i jdk
MySQL
使用 apt 安裝 MySQL
-
查找安裝包
apt list | grep "mysql-server"
-
安裝 MySQL
sudo apt install mysql-server
查看 MySQL 狀態
sudo systemctl status mysql
MySQL 安裝安全設置
默認的 MySQL 設置是不安全的,MySQL 安裝提供了一個安全腳本,用于解決不太安全的默認選項。
運行以下命令:
sudo mysql_secure_installation #安裝安全設置
執行過程:
-
是否設置驗證密碼組件:
Press y|Y for Yes, any other key for No: Y #是否設置驗證密碼組件
-
密碼強度設置:
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 #設置密碼強度
-
刪除匿名用戶:
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y #默認情況下,MySQL安裝有一個匿名用戶, 允許任何人登錄MySQL. 是否刪除匿名用戶?
-
禁止 root 用戶遠程登錄:
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y #僅應允許root從'localhost'連接
-
刪除 test 數據庫:
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y #默認情況下, MySQL帶有?個test數據庫, 是否刪除?
-
重新加載權限表:
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y #是否現在加載配置, 使剛才的修改生效?
-
完成:
All done!
通過以上步驟,MySQL 的安全設置已經完成,確保了數據庫的安全性。設置密碼
連接 MySQL 服務器
sudo mysql
使用 ALTER USER
命令修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'BITE@yyds.666';
退出 MySQL
exit
再次登錄輸入:
mysql -uroot -p # 密碼: BITE@yyds.666
卸載 MySQL
- 停止 MySQL
sudo systemctl stop mysql
- 卸載 MySQL
sudo apt-get remove --purge mysql-server mysql-client mysql-common
- 刪除 MySQL 配置文件和數據
sudo rm -rf /etc/mysql /var/lib/mysql
- 清理殘留文件和目錄
sudo apt-get autoremove
sudo apt-get autoclean
- 驗證卸載結果
mysql --version
部署 Web 項目到 Linux
環境配置
確保程序正常運行需完成以下配置:
-
數據庫準備
- 執行提供的建表腳本,確保表結構與服務器一致
-
多環境配置
- 按環境創建配置文件(如開發/測試/生產環境)
- 命名格式:
application-XXX.yml
或application-XXX.properties
- 差異化配置項示例:MySQL賬號密碼、服務端口等
關鍵點:通過文件命名
區分環境,避免硬編碼敏感信息。
以下以application-XXX.yml
為例:
application-dev.yml: 開發環境配置
server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456 # windows 數據庫密碼driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # linux 服務器沒必要打日志, 打日志也會影響性能
logging:file:name: spring-blog.log
application-prod.yml: 生產環境配置
:
server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: BITE@yyds.666driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:file:name: spring-blog.log
如果同時有三個yml
文件,通常只有主配置文件application.yml
會自動生效。為了使其他配置文件(如application-prod.yml
或application-dev.yml
)生效,需要在主配置文件application.yml
中進行相應的配置。具體步驟如下:
刪除主配置文件中的數據庫相關配置
: 在application.yml
中刪除與數據庫相關的配置項,以避免沖突。指定生效的配置文件
: 在application.yml
中添加配置,指定使用application-prod.yml
或application-dev.yml
作為生效的配置文件。
在Spring框架中,spring.profiles.active
屬性用于指定激活的配置文件,application.yml
二選一即可:
spring:profiles:active: prod
spring:profiles:active: dev
這里的active
屬性值填的是配置文件名的一部分
(如dev
、prod
等),而不是完整的文件名(如application-prod.yml
或application-dev.yml
)。
啟動程序:
測試接口:
當前配置文件中的數據庫密碼是按照 Linux 系統的設置來配置的,與 Windows 系統的數據庫密碼不一致,從而導致接口訪問失敗:
在不同環境之間來回切換時,需要頻繁修改配置文件中的active
值。在多人協作的場景下,很容易出現忘記修改active
值的情況,從而導致配置錯誤。
為了避免這種情況,我們可以通過從 Maven 中讀取環境配置變量來為active
賦值:
<profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><activation><activeByDefault>true</activeByDefault></activation><properties><profile.name>prod</profile.name></properties></profile>
</profiles>
注意,每次勾選新的 profile 都需要刷新 maven
修改 application.yml
spring:profiles:active: @profile.name@
勾選好 profile
后,刷新 maven,重新運行程序:
測試接口,此時接口訪問成功:
構建項目并打包
在本地使用 Maven 進行打包:
- 如果 Test 代碼中有與環境配置相關的操作(比如數據庫相關的操作),打包會失敗,可以跳過測試。
- 點擊
clean -> package
。
將 dev
切換成 prod
,刷新 maven 并打包:
因為這個項目使用的是 mybatis-plus ,所以不需要寫 mybatis 的測試用例,所以打包成功
:
如果使用的是
MyBatis
而非MyBatis-Plus
,就需要在單元測試
中編寫 MyBatis 的接口測試代碼
。在
Maven
的配置文件中,如果選擇了prod
環境配置并刷新了 Maven
,然后按照生命周期
的package
命令進行打包,那么 Maven 會依次執行clean、validate、compile、test、package
階段:在 Maven 的
test 階段運行單元測試
時,由于配置的數據庫密碼與 Windows 系統的數據庫密碼不一致,導致 MyBatis 無法連接到數據庫,從而使得單元測試失敗
。
單元測試失敗會中斷 Maven 的打包過程,導致打包失敗
。解決方案:在打包前,設置去掉 test 階段,避免打包過程因為 test 的問題導致打包過程被打斷:
接下來,根據日志路徑,在本地找到打好的 Jar 包:
上傳 Jar 包到服務器并運行
1. 上傳 Jar 包
在 linux 系統中,創建和 windows 對應數據庫及數據表
-- 建表 SQL
create database if not exists java_blog_spring charset utf8mb4;use java_blog_spring;-- 用戶表
DROP TABLE IF EXISTS java_blog_spring.user_info;
CREATE TABLE java_blog_spring.user_info(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (128) NOT NULL,
`password` VARCHAR (128) NOT NULL,
`github_url` VARCHAR (128) NULL,
`delete_flag` TINYINT (4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id),
UNIQUE INDEX user_name_UNIQUE (user_name ASC)) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用戶表';-- 博客表
drop table if exists java_blog_spring.blog_info;
CREATE TABLE java_blog_spring.blog_info (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NULL,
`content` TEXT NULL,
`user_id` INT(11) NULL,
`delete_flag` TINYINT(4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';-- 新增用戶信息
insert into java_blog_spring.user_info (user_name, password, github_url) values("zhangsan", "123456", "https://gitee.com/bubblefish666/class-java45");
insert into java_blog_spring.user_info (user_name, password, github_url) values("lisi", "123456", "https://gitee.com/bubblefish666/class-java45");insert into java_blog_spring.blog_info (title, content, user_id) values("第一篇博客", "111我是博客正文我是博客正文我是博客正文", 1);
insert into java_blog_spring.blog_info (title, content, user_id) values("第二篇博客", "222我是博客正文我是博客正文我是博客正文", 2);
為了能通過加密、加鹽功能的密碼校驗,更新 linux 數據庫表中,用戶的密碼:
update user_info set password= 'e5bf3de57e3243ab9d94b59b379a0a640f967f2e3ae738c2f5474ab0fe46389b' where id in(1,2);
直接拖動打好的 Jar 包到 Xshell 窗口即可完成文件的上傳。
Xshell 可以直接拖動文件到窗口,達到上傳文件的目的。如果使用其他客戶端,不支持文件的上傳,需要借助 lrzsz
命令;
借助 mv 改一下 jar 包名:
2. 運行程序
接下來,在 linux 上運行該 jar 包:
java -jar blog.jar
部署程序后,日志輸出可能會非常頻繁。如果使用以下命令啟動程序:
java -jar blog.jar
那么在按下Ctrl+C
停止日志輸出時,程序也會隨之停止運行,導致服務無法繼續提供
。為了避免這種情況,應使用以下命令啟動程序:
nohup java -jar blog.jar &
nohup 命令詳細介紹
這樣,即使關閉終端或退出當前會話,程序仍能在后臺 持續運行
,不會因Ctrl+C
操作而中斷,從而確保服務的穩定性。
開放端口號
如果外網需要訪問該服務,需要先服務器防火墻開放對應的端口號。
本著服務器安全的原則,云服務器上的端口非必要不開啟
。比如常見端口號:數據庫 3306、Redis 6379,盡可能避免開放,而是采用其他方式來連接,比如配置隧道
的方式。
確保列表中有添加的規則:
驗證程序
-
訪問項目:
http://IP:Port/blog_login.html
- 將
IP
改為云服務器的 IP,Port
改為項目的端口號。
- 將
-
按照項目功能進行驗證:
-
驗證賬號注冊登錄。
-
驗證展示博客列表。
-
驗證博客編輯功能
-
驗證新增博客。
-
驗證展示博客內容。
-
…
-
跟蹤日志
實時追蹤日志
tail -f [日志文件名]
此時再訪問接口,就會出現相關的日志:
過濾日志
我們關注的重點是 ERROR
級別的日志,而非 INFO
級別的日志。因此,可以使用以下命令來跟蹤日志,直接過濾出 ERROR
級別的日志內容:
tail -f nohup.out | grep "ERROR"
如果需要停止當前的日志跟蹤,可以按 Ctrl+C
,然后重新輸入上述命令以繼續跟蹤。
過濾日志后,INFO
級別的日志不在顯示,只顯示 ERROR
級別的日志:
使用重定向將日志輸出到自定義文件
如果想將輸出的日志存儲到自定義文件中,可以使用重定向操作
。
nohup java -jar blog.jar >指定文件路徑 2>&1 &
>
:將標準輸出(日志信息)
重定向到指定文件
。2>&1
:將標準錯誤
也重定向到指定文件,確保所有輸出都寫入同一文件
。&
:將命令在后臺運行,避免阻塞終端
。
例如:
nohup java -jar blog.jar >aa.log &more aa.log | grep "ERROR"
在 Linux 中,>
操作符可以將命令的輸出內容寫入指定文件,這種操作稱為“重定向”
配置日志存儲文件
我們沒有看見 jar 包同目錄下,生成對應存儲日志的 spring-blog.log
文件,但是我們配置文件中配置了:
后續發現,日志的格式配置錯誤了,糾正配置文件的 log 配置格式后,clean
一下,重新上傳并運行新的 Jar 包。:
此時,在對應 Jar 包目錄下,除了nohup.out
,還會生成一個名為spring-blog.log
的文件,專門用于存儲服務生成的日志:
在程序啟動前,日志默認存儲在
nohup.out
文件中。一旦程序啟動,根據配置文件的指定
,日志將存儲到spring-blog.log
文件中。
因此,若要追蹤日志,應使用以下命令:
tail -f spring-blog.log | grep "ERROR"
而不是:
tail -f nohup.out | grep "ERROR"
常見問題
一個程序的正常運行,需要程序的正確和環境的正確。同樣的代碼在 Windows 上可以運行成功,不一定在 Linux 上運行成功。不同的系統對代碼的理解和支持是不同的。比如 Windows 系統對 MySQL 不區分大小寫,Linux 區分大小寫。
服務不能正常訪問的原因有很多,主要分以下幾個方面:
-
服務未啟動
- 使用
ps -ef | grep java
查看程序是否在運行。 - 使用
curl http://127.0.0.1:8080/blog_login.html
看下是否有返回 HTML 頁面。如果有返回,說明程序啟動成功了,考慮端口未開放。 - 如果未啟動成功,需要查看對應的日志,根據原因來分析:
- 數據庫不存在。
- 表不存在(區分大小寫)。
- 數據庫密碼不正確。
- JDK 安裝版本不對,或者未安裝。
- MySQL 未設置密碼。
- …
- 使用
-
HTTP 端口未開放
檢查云服務器防火墻/安全組是否開放相應端口(如 8080)
。
殺掉進程
如果我們需要重啟服務,或者重新部署等,都需要先停止之前的服務。
(1) 查看當前服務的進程
ps -ef | grep java
上圖中的 35104
就是該服務的進程。
(2) 殺掉進程
kill -9 PID
殺掉服務對應正在運行的進程,服務此時就不能再訪問了:
再次運行 Jar 包:
總結
- 連接 Linux 服務器的方式有很多,Xshell 只是其中一種。
Xshell 是一個客戶端,而非服務器
。 - Ubuntu 軟件管理工具是
apt
,其他的 Linux 發行版本軟件包管理工具不同,比如 CentOS 是使用yum
來管理軟件的。 - Spring Boot 可以使用多個配置文件來完成不同平臺的配置。
- 在 Windows 上可以運行成功的代碼,在 Linux 上不一定能運行成功。
- 啟動程序需要使用
nohup
后臺運行,需要停止服務時,使用kill
命令。