Java 程序可以打包为 JAR 文件,它们是包含清单 ( META-INF/MANIFEST.MF) 的 ZIP 文件,该清单指定要启动的 Java 类;
java -jar,给定一个 JAR 文件,将查看清单并启动相应的类,从 JAR 文件和 Java 运行时加载任何其他所需的资源(也可以指定另一个要运行的类,但这与这里无关);
ZIP 文件可以以任意数据开头;这就是自解压可执行文件的工作方式(可执行 ZIP 文件将在运行时自行解压)。
JAR 文件也是如此svg2png,但带有一个前置的 shell 脚本:
#!/bin/sh
exec java -Xmx1G -jar "$0" "$@"
运行时,这将运行一个 shell,然后它将自身替换java -Xmx1G -jar为“脚本”的名称(svg2png使用任何使用的路径)和任何参数。在这种情况下-Xmx1G,设置堆大小,并-jar告诉 JVM “运行”给定的 JAR 文件。svg2png剩下的svg2png就是 JAR 文件;特别是,它包含以下清单:
这是一个独立的 Java 程序,它依赖于一些“技巧”:
META-INF/MANIFEST.MF
) 的 ZIP 文件,该清单指定要启动的 Java 类;java -jar
,给定一个 JAR 文件,将查看清单并启动相应的类,从 JAR 文件和 Java 运行时加载任何其他所需的资源(也可以指定另一个要运行的类,但这与这里无关);JAR 文件也是如此
svg2png
,但带有一个前置的 shell 脚本:运行时,这将运行一个 shell,然后它将自身替换
java -Xmx1G -jar
为“脚本”的名称(svg2png
使用任何使用的路径)和任何参数。在这种情况下-Xmx1G
,设置堆大小,并-jar
告诉 JVM “运行”给定的 JAR 文件。svg2png
剩下的svg2png
就是 JAR 文件;特别是,它包含以下清单:这指示 JVM 运行
org.sterl.svg2png.Main
启动程序的类。您将在 Wikipedia 上找到有关 ZIP 格式的更多详细信息,特别是显示该格式如何在文件开头(以及其他位置)允许任意数据的结构描述。ZIP 文件由位于文件末尾的“中央目录”标识。