我有一个 .deb 包,其中包含一个需要 Java 才能运行的应用程序。但是,我不关心他们安装了哪种实现(例如 OpenJDK、IcedTea、Oracle),并且我不想强迫用户在安装了另一种实现的情况下下载另一种实现。我还想处理用户未安装任何实现的情况。
有没有办法可以表明 .deb 包需要任何 Java 实现?如果是这样,我如何处理没有安装任何实现的情况?
答案1
.deb
指示包需要 Java 运行时环境(JVM,而不是 JDK)的标准方法是指定对default-jre
或 的依赖default-jre-headless
(前者用于具有 GUI 的程序,后者如果不需要 GUI),以及对适当的版本java-runtime
(java6-runtime
如果您的应用程序使用 Java 6 或更高版本、java7-runtime
Java 7 或更高版本等):
Depends: default-jre | java6-runtime
或者
Depends: default-jre-headless | java6-runtime-headless
ETC。
这可以处理所有 Debian 提供的 JRE(或 Debian 衍生版本)和 Oracle JRE如果它们是使用java-package
.default-jre
取决于默认的 JRE (适用于 Debian 8 的 OpenJDK 7,适用于 Debian 9 的 OpenJDK 8,适用于 Debian 10 的 OpenJDK 11),因此如果没有安装其他 JRE,这将确保安装 JRE。各种 JRE 包java-runtime
根据其支持级别提供变体,因此这意味着将使用任何现有的、兼容的 JRE(适当打包),而不是强制用户安装另一个 JRE。
如果您确实想支持任何已安装的 JRE,包括手动安装、未打包的 Oracle JRE,则只能在包的“推荐”节中使用上述内容,然后尝试java
从启动脚本运行。理想情况下,您应该在安装时(在 中postinst
,但确保如果没有找到 JRE,安装不会失败)以及需要运行时检查是否存在 JRE java
— 如果您的包包含 initscript,这可能会很复杂或 systemd 单元等(复杂是因为如何通知管理员出现问题并不明显,但您可以确定会被注意到并理解)。
答案2
如果将其插入到控制文件中,则可以指定最低 java 版本,还可以指定要安装的 java 实现(如果尚未安装适当的 java 版本):
Depends: openjdk-21-jdk-headless | java-sdk-headless (>= 21), ...
java-sdk-headless 是一个虚拟包,由任何 java 21 兼容运行时提供。