我下载了打包在 sh 文件中的 jgit 并在 mingw 中运行它。我在进程列表中看到 java 进程仅使用主类和参数启动
"c:\Program Files\Java\jdk1.6.0_26\bin\java.exe" org.eclipse.jgit.pgm.Main diff master
我检查了进程当前目录中解压的主类,什么也没有!主类位于文件系统的哪里?
答案1
.sh
它在文件的第 88 行将类路径设置为文件的路径.sh
。
this_script=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && this_script="$0"
cp=$this_script
[...]
CLASSPATH="$cp"
export CLASSPATH
没有必要“解压”主类。
它使用一个技巧将 shell 脚本和实际的 JAR/ZIP 数据合并到一个文件中:它利用了 ZIP 文件的中央数据结构就到此为止了。/file reader 只是简单地介绍了zip
一下jar
开头的“垃圾数据”shell 脚本。
通常,zip 文件中的第一部分是 zip 条目,可以通过其签名轻松识别。但 zip 文件不一定以 zip 条目开头,而且 zip 规范也不要求如此。
只要 shell 脚本代码exit
在实际的zip
/jar
数据开始之前,shell 就不会关心文件中 shell 脚本部分之后的“垃圾数据”。