6.11 使用 Java

6.11.1 变量定义

  如果您的 port 需要 Java™ 开发包 (JDK™) 来完成联编、 支持运行, 甚至完成解开源代码包这样的工作, 就应该定义 USE_JAVA

  在 Ports Collection 中有许多不同的 JDK, 它们的版本各不相同, 或是来自不同的供应商。 如果您的 port 必须使用其中的某个特定的版本, 也可以予以定义。 最新的稳定版本是 java/jdk16

表 6-14. 用到 Java 的 port 可以使用的变量

变量 意义
USE_JAVA 只有定义它才能使其它变量生效。
JAVA_VERSION 用空格分开的适合 port 使用的 Java 版本。 可选的 "+" 可以用于指定某个范围的版本 (可以用: 1.5[+] 1.6[+] 1.7[+] )。
JAVA_OS 用空格分开的适应 port 的 JDK port 操作系统类型 (可以用: native linux)。
JAVA_VENDOR 用空格分开的适应 port 的 JDK port 供应商 (可以用: freebsd bsdjava sun openjdk)。
JAVA_BUILD 设置这个变量表示所选的 JDK port 应被列入 port 的联编依赖关系。
JAVA_RUN 设置这个变量表示所选的 JDK port 应被列入 port 的运行环境依赖关系。
JAVA_EXTRACT 设置这个变量表示所选的 JDK port 应被列入 port 的解压缩支持依赖关系。

  下面是在设置了 USE_JAVA 之后, port 能够从系统中获得的配置:

表 6-15. 向使用了 Java 的 port 提供的变量

变量
JAVA_PORT JDK port 的名字 (例如 'java/diablo-jdk16')。
JAVA_PORT_VERSION JDK port 的完整版本 (例如 '1.6.0')。 如果您只需要版本号的前两位, 则可用 ${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}
JAVA_PORT_OS 所用 JDK port 的操作系统 (例如 'native')。
JAVA_PORT_VENDOR 所用 JDK port 的供应商 (例如 'freebsd')。
JAVA_PORT_OS_DESCRIPTION 所用 JDK port 操作系统的描述 (例如 'Native')。
JAVA_PORT_VENDOR_DESCRIPTION 所用 JDK port 供应商的描述 (例如 'FreeBSD Foundation')。
JAVA_HOME JDK 的安装目录 (例如 '/usr/local/diablo-jdk1.6.0')。
JAVAC 所用 Java 编译器的完整路径 (例如 '/usr/local/diablo-jdk1.6.0/bin/javac')。
JAR 所用 jar 工具的完整路径 (例如 '/usr/local/diablo-jdk1.6.0/bin/jar''/usr/local/bin/fastjar')。
APPLETVIEWER 所用 appletviewer 工具的完整路径 (例如 '/usr/local/diablo-jdk1.6.0/bin/appletviewer')。
JAVA 所用 java 执行文件的完整路径。 您应使用它来执行 Java 程序 (例如 '/usr/local/diablo-jdk1.6.0/bin/java')。
JAVADOC 所用 javadoc 工具的完整路径。
JAVAH 所用 javah 程序的完整路径。
JAVAP 所用 javap 程序的完整路径。
JAVA_KEYTOOL 所用 keytool 工具的完整路径。
JAVA_N2A 所用 native2ascii 工具的完整路径。
JAVA_POLICYTOOL 所用 policytool 程序的完整路径。
JAVA_SERIALVER 所用 serialver 程序的完整路径。
RMIC 所用 RMI 桩/架 生成器, rmic 的完整路径。
RMIREGISTRY 所用 RMI 注册表程序, rmiregistry 的完整路径。
RMID 所用 RMI 服务程序 rmid 的完整路径。
JAVA_CLASSES 所用 JDK 类文件目录的完整路径。 ${JAVA_HOME}/jre/lib/rt.jar

  您可以使用 java-debug make target 以获取用于调试 port 的信息。 大多数前述变量的值皆会予以呈现。

  此外, 还会定义下述常量, 以确保所有的 Java port 均以一致之方式安装:

表 6-16. 为使用 Java 的 port 定义的常量

常量
JAVASHAREDIR 所有 Java 相关资料的安装根目录。 默认值: ${PREFIX}/share/java.
JAVAJARDIR 用以安装 JAR 文件的目录。 默认值: ${JAVASHAREDIR}/classes
JAVALIBDIR 其它 port 安装的 JAR 文件所在的目录。 默认值: ${LOCALBASE}/share/java/classes

  相关的项也会定义在 PLIST_SUB (在 第 7.1 节 中进行介绍) 和 SUB_LIST 中。

6.11.2 采用 Ant 进行联编

  如果 port 采用 Apache Ant 进行联编, 则需要定义 USE_ANT。 如是, 则 Ant 将作为 子-make 命令来使用。 如果 port 未定义 do-build target, 则将默认依 MAKE_ENVMAKE_ARGSALL_TARGET。 的设置执行 Ant。 这类似于 第 6.3 节 中介绍的关于 USE_GMAKE 的机制。

6.11.3 最佳实践

  如果您正移植某个 Java 库, 您的 port 应把 JAR 文件安装到 ${JAVAJARDIR}, 而其它文件则应放在 ${JAVASHAREDIR}/${PORTNAME} 下 (除了文档, 参见下文)。 要减少打包文件的尺寸, 您可以直接在 Makefile 中引用这些 JAR 文件, 具体做法是使用下面的语句 (此处的 myport.jar 是作为 port 一部分安装的 JAR 文件的名字):

PLIST_FILES+= %%JAVAJARDIR%%/myport.jar

  移植 Java 应用程序时, port 通常会希望将所有文件安装到同一目录 (包括其依赖的 JAR)。 这时强烈建议使用 ${JAVASHAREDIR}/${PORTNAME}。 移植软件的开发人员, 可以自行决定是否将所依赖的其它 JAR 安装到此目录, 或直接使用已经装好的那些 (来自 ${JAVAJARDIR})。

  无论您正制作哪一类的 port (库或者应用程序), 附加的文档都应安装到和其它 port 同样的位置。 已经知道, JavaDoc 会根据 JDK 版本的不同而产生不同的文件。 对于那些不打算强制使用某一特定版本 JDK 的 port 而言, 这无疑提高了制作装箱单 (pkg-plist) 的难度。 这是为什么强烈建议使用 PORTDOCS 宏的原因。 更进一步, 即使您能够预测 javadoc 将要生成的文件, 所需的 pkg-plist 的尺寸, 也是鼓吹使用 PORTDOCS 的一大理由。

  DATADIR 的默认值是 ${PREFIX}/share/${PORTNAME}。 对 Java port 而言将 DATADIR 改为 ${JAVASHAREDIR}/${PORTNAME} 是一个好主意。 当然, DATADIR 会自动加到 PLIST_SUB 中 (在 第 7.1 节 有所介绍) 因此您可以在 pkg-plist 中直接使用 %%DATADIR%%

  撰写本文时, 对是应该从源代码联编, 还是直接安装预编译的 Java ports 安装包并没有明确的规定。 尽管如此, FreeBSD Java Project 的开发人员仍鼓励移植软件的开发者在不麻烦的情况下尽可能从源代码完成联编。

  本节中所介绍的全部特性, 均是在 bsd.java.mk 中实现的。 如果您感觉自己的 port 需要更为复杂的 Java 支持, 请首先参阅 bsd.java.mk CVS 日志, 因为通常撰文介绍最新特性需要一些时间。 此外, 如果您认为所缺少的支持对许多其它 Java port 亦属有益, 请在 FreeBSD Java 语言邮件列表 对其进行讨论。

  在 PR 中的 java 类别, 主要是用于 FreeBSD Java project 移植 JDK 本身之用。 因而, 提交您的 Java port 时, 应归入 ports 类别, 除非您正尝试解决的问题是 JDK 实现本身或 bsd.java.mk 的。

  类似地, 您应参考 第 5.3 节 中所详述的关于 CATEGORIES 在 Java port 中的使用规则。

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题, 请致函 <doc@FreeBSD.org>。