Centos7拉取编译运行SpringBoot
根据您的需求,这里是为脚本添加了自定义工具路径的改进版本,包含路径检查和环境变量设置:
#!/bin/bash
# 配置区(根据实际情况修改)
REPO_URL="https://github.com/yourusername/your-springboot-repo.git" # 项目仓库地址
BRANCH="master" # 要拉取的分支
PROJECT_DIR="/opt/springboot-app" # 项目部署目录
JAVA_OPTS="-Xmx512m -Xms256m" # JVM参数
# 自定义工具路径(如果为空则自动检测安装)
JAVA_HOME="/opt/module/jdk1.8.0_371" # 示例:"/usr/lib/jvm/java-1.8.0-openjdk"
GIT_PATH="/usr/bin/git" # 示例:"/usr/bin/git"
MAVEN_HOME="/opt/module/maven-3.9.4" # 示例:"/usr/share/maven"
# 安装必要依赖
install_dependencies() {
echo "▂▂▂▂▂▂▂▂▂▂▂▂▂▂ 依赖检查 ▂▂▂▂▂▂▂▂▂▂▂▂▂▂"
# 统一安装函数
install_package() {
echo "正在安装 $1..."
if ! sudo yum install -y "$1"; then
echo "错误:$1 安装失败!"
exit 1
fi
echo "$1 安装成功 ✔"
}
# Java环境设置
echo ">>> 检查Java环境"
if [[ -n "$JAVA_HOME" ]]; then
if [[ ! -x "$JAVA_HOME/bin/java" ]]; then
echo "错误:JAVA_HOME无效,找不到可执行文件 $JAVA_HOME/bin/java"
exit 1
fi
echo "使用自定义Java路径:$JAVA_HOME"
else
if ! command -v java &>/dev/null; then
install_package "java-1.8.0-openjdk-devel"
fi
# 精确获取JAVA_HOME
JAVA_HOME=$(java -XshowSettings:properties -version 2>&1 | grep 'java\.home' | awk '{print $3}')
[[ -z "$JAVA_HOME" ]] && {
echo "错误:自动获取JAVA_HOME失败!"
exit 1
}
echo "自动检测到JAVA_HOME:$JAVA_HOME"
fi
export JAVA_HOME
export PATH="$JAVA_HOME/bin:$PATH"
echo "Java版本:$(java -version 2>&1 | head -n 1)"
# Git环境设置
echo ">>> 检查Git环境"
if [[ -n "$GIT_PATH" ]]; then
if [[ ! -x "$GIT_PATH" ]]; then
echo "错误:Git路径无效:$GIT_PATH"
exit 1
fi
export PATH="$(dirname "$GIT_PATH"):$PATH"
echo "使用自定义Git路径:$GIT_PATH"
else
if ! command -v git &>/dev/null; then
install_package "git"
fi
GIT_PATH=$(command -v git)
echo "自动检测到Git路径:$GIT_PATH"
fi
echo "Git版本:$(git --version)"
# Maven环境设置
echo ">>> 检查Maven环境"
if [[ -n "$MAVEN_HOME" ]]; then
if [[ ! -x "$MAVEN_HOME/bin/mvn" ]]; then
echo "错误:MAVEN_HOME无效,找不到可执行文件 $MAVEN_HOME/bin/mvn"
exit 1
fi
echo "使用自定义Maven路径:$MAVEN_HOME"
else
if ! command -v mvn &>/dev/null; then
install_package "maven"
fi
# 精确获取MAVEN_HOME
MAVEN_HOME=$(mvn -v 2>/dev/null | grep 'Maven home' | awk '{print $3}')
[[ -z "$MAVEN_HOME" ]] && MAVEN_HOME=$(dirname "$(dirname "$(readlink -f "$(command -v mvn)")")")
[[ -z "$MAVEN_HOME" ]] && {
echo "错误:自动获取MAVEN_HOME失败!"
exit 1
}
echo "自动检测到MAVEN_HOME:$MAVEN_HOME"
fi
export MAVEN_HOME
export PATH="$MAVEN_HOME/bin:$PATH"
echo "Maven版本:$(mvn --version | head -n 1)"
echo "▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 依赖就绪 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
}
# 拉取/更新代码
clone_or_update() {
# 进入目录或克隆仓库
if [ -d "$PROJECT_DIR/.git" ]; then
echo "更新仓库代码..."
cd "$PROJECT_DIR" || { echo "进入项目目录失败!"; exit 1; }
# 清理工作区修改
git reset --hard HEAD || { echo "重置工作区失败!"; exit 1; }
git clean -fd || { echo "清理未跟踪文件失败!"; exit 1; }
# 切换分支(强制与远程分支同步)
git checkout -B "$BRANCH" "origin/$BRANCH" || { echo "切换分支失败!"; exit 1; }
# 拉取最新代码(使用 rebase 模式)
git pull --rebase origin "$BRANCH" || { echo "拉取代码失败!"; exit 1; }
else
echo "初次克隆仓库..."
rm -rf "$PROJECT_DIR"
git clone -b "$BRANCH" "$REPO_URL" "$PROJECT_DIR" || {
echo "克隆仓库失败!";
exit 1;
}
fi
}
# 构建项目
build_project() {
echo "开始编译打包..."
cd "$PROJECT_DIR" || { echo "进入项目根目录失败!"; exit 1; }
# 全量构建(推荐)或指定模块构建
# 方式1:构建整个项目(适合需要安装依赖到本地仓库的场景)
mvn clean package -DskipTests
# 验证构建结果(这样子写不好,我想以PROJECT_DIR为根路径,指定jar包的相对路径)
# 定位生成的JAR文件(根据实际pom.xml配置调整匹配模式)
#JAR_PATH=$(find "$PROJECT_DIR" \ # 在项目目录下递归搜索
# -path "*/target/*.jar" \ # 匹配所有target目录下的.jar文件
# -not -name "*-sources.jar" \ # 排除源码包(通常包含-sources后缀)
# -print | \ # 打印匹配结果
# grep -v '/test-' | \ # 过滤掉包含/test-的路径(排除测试包)
# head -n 1) # 取第一个匹配结果(假设只有一个主JAR)
# 各部分功能详解:
# 1. find "$PROJECT_DIR" : 从项目根目录开始递归搜索
# 2. -path "*/target/*.jar" : 匹配所有Maven标准输出目录中的JAR文件
# - 示例路径:/project/moduleA/target/app.jar
# 3. -not -name "*-sources.jar" : 排除Maven生成的源码包
# 4. grep -v '/test-' : 过滤掉测试模块的JAR(路径含/test-)
# 5. head -n 1 : 取第一个结果,适用于单模块项目
# 如果是多模块项目,建议指定具体子模块路径
JAR_PATH="/opt/module/XXXXX.jar"
if [ -z "$JAR_PATH" ]; then
echo "错误:未找到生成的JAR文件!"
exit 1
fi
echo "检测到构建产物:$JAR_PATH"
}
# 停止旧进程
stop_previous() {
PID_FILE="$PROJECT_DIR/app.pid"
if [ -f $PID_FILE ]; then
OLD_PID=$(cat $PID_FILE)
if ps -p $OLD_PID > /dev/null; then
echo "停止正在运行的进程 (PID: $OLD_PID)..."
kill $OLD_PID
sleep 5
else
echo "发现旧PID文件但进程不存在,清理中..."
fi
rm -f $PID_FILE
fi
}
# 启动应用
start_application() {
echo "启动Spring Boot应用..."
cd "$PROJECT_DIR"
nohup java $JAVA_OPTS -jar $JAR_PATH > application.log 2>&1 &
NEW_PID=$!
echo $NEW_PID > app.pid
echo "应用已启动,PID: $NEW_PID"
echo "日志文件:$PROJECT_DIR/application.log"
}
# 主流程
main() {
set -e
install_dependencies
clone_or_update
build_project
stop_previous
start_application
}
# 执行入口
main
更新说明:
-
路径配置灵活性:
• 新增JAVA_HOME、GIT_PATH、MAVEN_HOME三个可配置路径
• 用户可指定自定义安装路径,留空则自动检测系统路径
• 路径检查包含有效性验证(存在性、可执行性) -
智能路径处理:
# Java路径处理逻辑示例: if [[ -n "$JAVA_HOME" ]]; then # 验证自定义路径有效性 export PATH="$JAVA_HOME/bin:$PATH" else # 自动安装并获取系统安装路径 JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))) fi -
增强环境验证:
• 安装完成后显示各工具版本信息
• 严格校验路径有效性,避免错误配置导致后续失败 -
路径优先级规则:
自定义路径 → 系统环境路径 → 自动安装路径
使用建议:
-
自定义路径使用场景:
# 示例:使用手动安装的JDK 11 JAVA_HOME="/usr/java/jdk-11.0.15" # 示例:使用编译安装的最新版Git GIT_PATH="/usr/local/git/bin/git" # 示例:使用手动安装的Maven MAVEN_HOME="/opt/maven/apache-maven-3.8.6" -
生产环境推荐配置:
• 建议显式指定路径以确保版本一致性
• 关闭自动安装功能(删除else中的安装逻辑)
• 添加更严格的版本检查 -
路径检测原理:
# Java路径检测流程: which java → /usr/bin/java readlink -f → /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b09-2.el7_9.x86_64/jre/bin/java dirname ×2 → /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b09-2.el7_9.x86_64
注意事项:
-
自定义路径需要:
• 确保执行权限(chmod +x /path/to/binary)
• 配置正确的用户权限(避免权限不足) -
如果使用非yum安装的组件:
• 需要自行处理更新和维护
• 建议在脚本中添加版本验证逻辑 -
生产环境建议:
# 在main()开始处添加: set -o errexit # 遇到错误立即退出 set -o nounset # 使用未定义变量时报错 set -o pipefail # 管道命令中任意失败则整体失败
如果需要更严格的版本控制或离线安装支持,可以进一步扩展路径处理逻辑。
认证方式配置说明
方式一:SSH公钥认证(推荐)
生成密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 保存路径保持默认(~/.ssh/id_rsa)添加公钥到Git仓库:
- 查看公钥:
cat ~/.ssh/id_rsa.pub- 添加公钥到 GitHub 或 GitLab:
- GitHub:登录 GitHub 账号,点击右上角头像,选择 “Settings”,接着在左侧菜单中选择 “SSH and GPG keys”,然后点击 “New SSH key”,将上一步查看到的公钥内容复制到 “Key” 输入框中,最后点击 “Add SSH key” 完成添加。
- GitLab:登录 GitLab 账号,点击右上角头像,选择 “Edit profile”,在左侧菜单中选择 “SSH Keys”,将公钥内容粘贴到 “Key” 输入框,设置好 “Title” 和 “Expires at” 后,点击 “Add key” 完成添加。
脚本配置:
GIT_AUTH_METHOD="ssh" REPO_URL="git@github.com:yourusername/repo.git" # SSH格式地址 SSH_PRIVATE_KEY="/path/to/your/private_key" # 默认无需修改
GIT_AUTH_METHOD:设置为ssh,表明使用 SSH 认证方式。REPO_URL:请将其替换为你实际要访问的 Git 仓库的 SSH 格式地址。SSH_PRIVATE_KEY:一般使用默认生成的私钥路径即可,无需修改。注意:
在执行
git clone XXX命令时,若使用的是 root 用户,可能会遇到未配置 SSH 公钥认证的问题。此时,你可以将已配置好 SSH 公钥认证的用户的.ssh文件夹复制到 root 用户的家目录下,操作命令如下:cp -r /home/yourusername/.ssh /root/请将
/home/yourusername替换为实际已配置好 SSH 公钥认证的用户的家目录。通过以上步骤,你就可以使用 SSH 公钥认证的方式安全地访问 Git 仓库了。
方法一:通过命令行参数全局修改构建目录
在Maven命令中,使用
-Dproject.build.directory参数指定构建输出目录。这会改变所有构建产物(包括JAR)的存放路径。mvn clean package -Dproject.build.directory=/自定义/路径 -DskipTests生成的JAR将位于:
/自定义/路径/your-project-version.jar方法二:在pom.xml中配置插件输出路径
针对具体插件(如
maven-jar-plugin或spring-boot-maven-plugin),在pom.xml中添加配置:示例1:配置
maven-jar-plugin<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <outputDirectory>${project.basedir}/自定义目录</outputDirectory> </configuration> </plugin> </plugins> </build>示例2:配置Spring Boot插件
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <outputDirectory>${project.basedir}/自定义目录</outputDirectory> </configuration> </plugin>注意事项
• 路径格式:建议使用绝对路径或基于项目根目录的相对路径(如
custom/target)。
• 多模块项目:若项目包含子模块,全局参数会影响所有模块的构建路径。
• 插件覆盖:确保配置覆盖了实际打包所用的插件(如Spring Boot项目需配置对应的插件)。选择方法一快速调整所有输出,或方法二精确控制特定插件的路径。
1万+

被折叠的 条评论
为什么被折叠?



