Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java can';t生成shell脚本以生成jar文件_Java_Bash_Jar - Fatal编程技术网

Java can';t生成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"

我尝试制作一个简单的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" >"$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[@]}"