Java can';t生成shell脚本以生成jar文件
我尝试制作一个简单的shell脚本来制作一个jar文件。与Java can';t生成shell脚本以生成jar文件,java,bash,jar,Java,Bash,Jar,我尝试制作一个简单的shell脚本来制作一个jar文件。与-C结合使用的jar命令不适用于通配符。因此,我使用通配符来查找所需的文件。将它们写入一个文件,并在其上循环 它看起来像这样: the_classes='' cd "$bin_folder" tmp_dir=$(mktemp -d -t java_sucks) find "imui/core/" -type f -name "IMUI_Widget_Agent*.class"
-C
结合使用的jar命令不适用于通配符。因此,我使用通配符来查找所需的文件。将它们写入一个文件,并在其上循环
它看起来像这样:
the_classes=''
cd "$bin_folder"
tmp_dir=$(mktemp -d -t java_sucks)
find "imui/core/" -type f -name "IMUI_Widget_Agent*.class" >"$tmp_dir/classes.txt"
while IFS="" read -r p || [ -n "$p" ]
do
the_classes="${the_classes} -C '$bin_folder' '$p'"
done < "$tmp_dir/classes.txt"
现在,如果我复制并粘贴此命令以执行它,它将起作用强>
但我想避免每次手工复制和粘贴的体力劳动
现在我有:
eval "$("$cmd")"
但是我得到一个错误文件名太长
。无论我尝试什么,我做的每一次修复都会产生一个新问题。我已经工作了6个小时来制作这个脚本
向前迈出的好一步是什么?既然您cd“$bin\u folder”
实际上并不需要-C“$bin\u folder”
:
但是,如果仍要将它们作为较大脚本的一部分添加,则可以在数组中轻松、可靠地构建命令:
#!/bin/bash
shopt -s globstar
cmd=(jar cfm build/IMUI_Widget_Agent.jar imui/core/IMUI_Widget_Agent_MANIFEST.MF)
cd "$bin_folder"
for file in imui/core/**/IMUI_Widget_Agent*.class
do
cmd+=(-C "$bin_folder" "$file")
done
echo "About to execute: "
printf "%q " "${cmd[@]}"
echo
"${cmd[@]}"
或者,您可以简单地使用代码执行
eval“$cmd”
,这相当于回显和复制粘贴。但是,请注意,这是脆弱且容易出错的,因为它需要仔细转义您当前未执行的文件名。Hi,这看起来很干净,但是我的bash不支持shopt-s globstar
,我不想更新,因为这将意味着其他人也会遇到同样的问题。同样的代码适用于macOS的zsh
,如果你只是切换shebang并删除shopt-s globstar
,现在如果我删除shopt-s globstar
,它似乎也能起作用。非常感谢你,在你回答之前我已经让它工作了,但是我写的东西阅读和维护起来非常痛苦。如果你使用bash,那么**
相当于*
,只搜索一个级别。如果够了,那就太好了。否则,您也可以重写find
和while
循环,将其附加到数组中。
#!/bin/bash
shopt -s globstar
cd "$bin_folder"
jar cfm build/IMUI_Widget_Agent.jar \
imui/core/IMUI_Widget_Agent_MANIFEST.MF \
imui/core/**/IMUI_Widget_Agent*.class
#!/bin/bash
shopt -s globstar
cmd=(jar cfm build/IMUI_Widget_Agent.jar imui/core/IMUI_Widget_Agent_MANIFEST.MF)
cd "$bin_folder"
for file in imui/core/**/IMUI_Widget_Agent*.class
do
cmd+=(-C "$bin_folder" "$file")
done
echo "About to execute: "
printf "%q " "${cmd[@]}"
echo
"${cmd[@]}"