使用原始的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}"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人