使用原始的jar命令打包

有些环境由于安全考虑,上传东西很不方便,每次排查问题,都需要刻盘,杀毒扫描,然后审批才能上传,特别繁琐
所以想着在没有maven的情况下,我怎么去打包更新呢,首先想到的是将源码传到服务器上,这样后续可以在服务器上进行修改,
配合javac和jar命令完成打包操作,可以完成jar包的更新,方便自己,写了个简单的脚本


#!/bin/bash
baseDir=/opt/sources/test
buildDir=${baseDir}/.build
# 有一些依赖在编译时需要,如lombok,但是又不需要打进jar包中
provideLibDir=${buildDir}/provide
# 要打进jar里的依赖,形成胖包
depLibDir=${buildDir}/dep
targetDir=${buildDir}/target
mainDir=${baseDir}/src/main
javaDir=${mainDir}/java
resourcesDir=${mainDir}/resources
outputFileName=test.jar

# java肯定是有的,不然跑不起来
JAVA_HOME=/opt/software/java
# 一般服务器都有一个依赖的地方,要不然服务跑不起来,如WEB-INF/lib
LIB_DIR=/opt/dep/lib

export PATH=${JAVA_HOME}/bin:${PATH}

find ${javaDir} -name *.java > ${buildDir}/sources.txt

rm -rf ${buildDir}/${outputFileName}
rm -rf ${targetDir}/*


function addFile2Jar() {
  cd ${1}
  for file in $(find .); do
    echo "正在添加文件:${file}"
    jar -uf ${buildDir}/${outputFileName} ${file} .
  done
}

function addFile2JarExclude() {
  cd ${1}
  for file in $(find . -not -name "${2}" -type f); do
    echo "正在添加文件:${file}"
    jar -uf ${buildDir}/${outputFileName} ${file} .
  done
}


## 收集依赖
for jar in "${provideLibDir}"/*.jar; do
  CLASSPATH="${CLASSPATH}:$jar"
done
for jar in "${LIB_DIR}"/*.jar; do
  CLASSPATH="${CLASSPATH}:$jar"
done
echo "CLASSPATH: ${CLASSPATH}"
  
## 编译java成class
javac -cp ${CLASSPATH} -d ${targetDir} -encoding utf8  @${buildDir}/sources.txt

for jar in ${depLibDir}/*.jar; do
  cp ${jar} ${targetDir}
  cd ${targetDir}
  jarname=$(basename ${jar})
  echo "开始解析依赖...${jar},文件名:${jarname}"
  jar -xf ${jarname}
  # 解压完了,直接把原来的jar删除掉
  rm -rf ${targetDir}/${jarname}
done

cd ${targetDir}
jar -cvf ${buildDir}/${outputFileName}  .

## 将资源文件更新到jar包中
addFile2Jar "${resourcesDir}"
## jar命令不会添加.class之外的文件,还得手动加
addFile2JarExclude "${targetDir}" "*.class"

# 清理没用的东西
rm -rf ${targetDir}/*
rm -rf ${buildDir}/jartmp*.tmp

echo "编译完成: ${buildDir}/${outputFileName}"

posted @ 2023-05-30 11:03  骑白马走三关  阅读(25)  评论(0编辑  收藏  举报