不依赖外部工具启动java项目的三种方案
以我的项目GoPick为例
1.命令行启动
执行java文件 直接运行 Ctrl+C 会停止
指定内存和端口
java -Xms512m -Xmx1024m -jar GoPick-0.0.1-SNAPSHOT.jar --server.port=8080
使用外部配置文件
java -jar GoPick-0.0.1-SNAPSHOT.jar --spring.config.location=/path/to/application.yml
指定环境
java -jar GoPick-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
接下来启动项目
文件目录

使用以下命令启动
java -jar GoPick-0.0.1-SNAPSHOT.jar --spring.config.location=./application.yaml

后台运行java文件 慎用 查看启动的进程不方便 当进程多了以后
nohup java -jar GoPick-0.0.1-SNAPSHOT.jar --spring.config.location=./application.yaml > app.log 2>&1 &
查看进程
ps aux | grep GoPick-0.0.1-SNAPSHOT.jar | grep -v grep
pgrep -f "GoPick-0.0.1-SNAPSHOT.jar" | wc -l
查看端口
netstat -tlnp | grep :8080
2.systemctl
使用操作系统进行管理
注意必须在 /etc/systemd/system 下创建
我的文件目录 /etc/systemd/system/go-pick.service
[Unit]
Description=go-pick
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/go-pick
#命令行 将刚刚的启动命令写在这里
ExecStart=/bin/bash -c 'java -Xms512m -Xmx1024m -jar /root/go-pick/GoPick-0.0.1-SNAPSHOT.jar'
#控制什么时候重启
Restart=on-failure
RestartSec=10
#日志输出
StandardOutput=append:/root/go-pick/logs/app.log
StandardError=append:/root/go-pick/logs/error.log
#配置环境变量 如果项目中需要用到环境变量 最好在这里设置
Environment="ALIBABA_CLOUD_ACCESS_KEY_ID=LTAI5t5eStBqUV1v1HL1Tmhf"
Environment="ALIBABA_CLOUD_ACCESS_KEY_SECRET=tgIZ9IW9lKTwINds2Hi1PgcsDGbo1P"
[Install]
WantedBy=multi-user.targetsystemctl命令
# 重载配置
sudo systemctl daemon-reload
# 启动/停止/重启
sudo systemctl start go-pick.service
sudo systemctl stop go-pick.service
sudo systemctl restart go-pick.service
# 查看状态和日志
sudo systemctl status go-pick.service
sudo journalctl -u go-pick.service -f
# 开机自启
sudo systemctl enable go-pick.service修改配置或创建配置以后 使用 sudo systemctl daemon-reload 重载配置才会生效
然后使用 sudo systemctl start go-pick.service 这个启动

3.Shell 脚本管理
方案1的集成 将命令写在脚本文件里 使用脚本启动项目
#!/bin/bash
# ========== 配置区域 ==========
APP_NAME="GoPick-0.0.1-SNAPSHOT.jar"
APP_PATH="/root/go-pick/$APP_NAME"
LOG_DIR="/root/go-pick/logs"
LOG_FILE="$LOG_DIR/app.log"
PID_FILE="/root/go-pick/app.pid"
JAVA_OPTS="-Xms512m -Xmx1024m"
SPRING_CONFIG="--spring.config.location=/root/go-pick/application.yaml"
# =============================
# 确保日志目录存在
mkdir -p "$LOG_DIR"
# 检查应用是否运行
is_running() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p "$PID" > /dev/null 2>&1; then
return 0
else
# PID 文件存在但进程不存在,删除无效的 PID 文件
rm -f "$PID_FILE"
return 1
fi
fi
return 1
}
# 启动应用
start() {
if is_running; then
echo "❌ 应用已在运行,PID: $(cat $PID_FILE)"
exit 1
fi
echo "🚀 正在启动 $APP_NAME ..."
nohup java $JAVA_OPTS -jar "$APP_PATH" $SPRING_CONFIG > "$LOG_FILE" 2>&1 &
PID=$!
echo $PID > "$PID_FILE"
echo "✅ 启动成功,PID: $PID"
echo "📝 查看日志: tail -f $LOG_FILE"
}
# 停止应用
stop() {
if ! is_running; then
echo "❌ 应用未运行"
exit 1
fi
PID=$(cat "$PID_FILE")
echo "🛑 正在停止应用,PID: $PID"
kill "$PID"
# 等待进程结束
for i in {1..10}; do
if ! ps -p "$PID" > /dev/null 2>&1; then
break
fi
sleep 1
done
# 如果还没结束,强制杀死
if ps -p "$PID" > /dev/null 2>&1; then
echo "⚠️ 强制停止进程"
kill -9 "$PID"
fi
rm -f "$PID_FILE"
echo "✅ 已停止"
}
# 重启应用
restart() {
echo "🔄 重启应用..."
stop
sleep 2
start
}
# 查看状态
status() {
if is_running; then
PID=$(cat "$PID_FILE")
echo "✅ 应用运行中"
echo " PID: $PID"
echo " 内存使用: $(ps -p $PID -o rss= | awk '{printf "%.2f MB", $1/1024}')"
echo " 运行时间: $(ps -p $PID -o etime= | xargs)"
echo " 日志文件: $LOG_FILE"
else
echo "❌ 应用未运行"
fi
}
# 查看实时日志
log() {
if [ -f "$LOG_FILE" ]; then
tail -f "$LOG_FILE"
else
echo "❌ 日志文件不存在: $LOG_FILE"
fi
}
# 帮助信息
usage() {
echo "用法: $0 {start|stop|restart|status|log}"
echo ""
echo "命令说明:"
echo " start - 启动应用"
echo " stop - 停止应用"
echo " restart - 重启应用"
echo " status - 查看状态"
echo " log - 查看实时日志"
}
# 主逻辑
case "$1" in
start) start ;;
stop) stop ;;
restart) restart ;;
status) status ;;
log) log ;;
*) usage ;;
esac文件目录

使用文件之前需要为文件添加执行权限 使用chmod +x go-pick.sh 添加执行权限
使用文件
