背景

使用 java 的 maven 构建项目时,若有很多命令是基于这个 jar 文件运行的。每次升级构建的版本号时都要将一些 .sh 文件的该 jar 文件改动文件名中版本号的部分。 忘记了话,下次运行时用的就是旧的版本。若是能够自动获取最新的 jar 文件路径,那么就可以不用有这个烦恼了。 直接执行对应的 .sh 文件即可。

定义一个函数集的 sh 文件

首先将写好的函数放到指定的 functions.sh 内,比如我将该文件放在 ~/configuration/functions.sh

#!/bin/sh
# 根据输入参数 $1 的 pom.xml 获取该 pom.xml 生成的 jar 的路径
function project_jar_file() {
  project_dir=$(dirname "$1")
# 使用grep命令检查文件中是否包含spring-boot-starter-parent
if grep -q "<artifactId>spring-boot-starter-parent</artifactId>" "$1"; then
    # 如果包含,则提取第二个版本号
    artifactId=$(sed -n 's/.*<artifactId>\([^<]*\)<\/artifactId>.*/\1/p' "$1" | grep -m 2 . | tail -n 1)
    version=$(sed -n 's/.*<version>\([^<]*\)<\/version>.*/\1/p' "$1" | grep -m 2 . | tail -n 1)
else
    # 如果不包含,则提取第一个版本号
    artifactId=$(sed -n 's/.*<artifactId>\([^<]*\)<\/artifactId>.*/\1/p' "$1" | head -n 1)
    version=$(sed -n 's/.*<version>\([^<]*\)<\/version>.*/\1/p' "$1" | head -n 1)
fi

jar_file_name="${artifactId}-${version}.jar"
target_jar_file="${project_dir}/target/${jar_file_name}"
echo "${target_jar_file}"
}


# 递归查找 pom.xml 文件
# 在当前目录找 pom.xml 如果没找到就递归找父目录的 pom.xml 找到一个后退出并返回该 pom.xml 的绝对路径
function find_pom_xml() {
    current_dir=$1
    pom_file="$current_dir/pom.xml"

    # 检查当前目录是否存在 pom.xml 文件
    if [ -f "$pom_file" ]; then
        echo "$(readlink -f ${pom_file})"
        return
    fi

    # 找到根目录,停止递归
    if [ "$current_dir" == "/" ]; then
        echo "pom.xml not found"
        return
    fi

    # 递归查找父目录中的 pom.xml 文件
    parent_dir=$(dirname "$current_dir")
    find_pom_xml "$parent_dir"
}

# 获取当前项目的 jar 路径
function get_jar_file_path() {
    # 在当前目录及其父目录中查找 pom.xml 文件
    pom_file=$(find_pom_xml "$(pwd)")
    jar_file_path=$(project_jar_file "${pom_file}")
    echo "${jar_file_path}"
}

定义系统变量

在系统启动的 ~/.zprofile 增加自定义的常量

export MY_FUNCTIONS_FILE=~/configuration/functions.sh

编写自己的脚本

比如 demo 这个项目的 run_demo.sh

# 导入 functions.sh
source "${MY_FUNCTIONS_FILE}"
# 将自动获取的当前项目构建的 jar 文件路径并输出
jar_file=$(get_jar_file_path "$(pwd)")
#启动该 jar 应用
java -jar $jar_file