如果您的 port 需要 Java™ 开发包 (JDK™) 来完成联编、 支持运行, 甚至完成解开源代码包这样的工作, 就应该定义 USE_JAVA。
在 Ports Collection 中有许多不同的 JDK, 它们的版本各不相同, 或是来自不同的供应商。 如果您的 port 必须使用其中的某个特定的版本, 也可以予以定义。 最新的稳定版本是 java/jdk16。
表 6-14. 用到 Java 的 port 可以使用的变量
变量 | 意义 |
---|---|
USE_JAVA | 只有定义它才能使其它变量生效。 |
JAVA_VERSION | 用空格分开的适合 port 使用的 Java 版本。 可选的 "+" 可以用于指定某个范围的版本 (可以用: 1.1[+] 1.2[+] 1.3[+] 1.4[+] 1.5[+] 1.6[+])。 |
JAVA_OS | 用空格分开的适应 port 的 JDK port 操作系统类型 (可以用: native linux)。 |
JAVA_VENDOR | 用空格分开的适应 port 的 JDK port 供应商 (可以用: freebsd bsdjava sun ibm blackdown)。 |
JAVA_BUILD | 设置这个变量表示所选的 JDK port 应被列入 port 的联编依赖关系。 |
JAVA_RUN | 设置这个变量表示所选的 JDK port 应被列入 port 的运行环境依赖关系。 |
JAVA_EXTRACT | 设置这个变量表示所选的 JDK port 应被列入 port 的解压缩支持依赖关系。 |
USE_JIKES | port 是否应使用 jikes bytecode 编译器进行联编。 如果没有设置, 则 port 将在 jikes 可用的情况下在联编时使用它。 您也可以明确地禁止使用或要求使用 jikes (通过将这个变量设置为 'no' 或 'yes')。 后一种情形中, devel/jikes 将加入 port 的联编依赖关系。 任何情况下, 如果 jikes 被作为 javac 使用, 则 bsd.java.mk 会定义 HAVE_JIKES 变量。 |
下面是在设置了 USE_JAVA 之后, port 能够从系统中获得的配置:
表 6-15. 向使用了 Java 的 port 提供的变量
变量 | 值 |
---|---|
JAVA_PORT | JDK port 的名字 (例如 'java/jdk14')。 |
JAVA_PORT_VERSION | JDK port 的完整版本 (例如 '1.4.2')。 如果您只需要版本号的前两位, 则可用 ${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}。 |
JAVA_PORT_OS | 所用 JDK port 的操作系统 (例如 'linux')。 |
JAVA_PORT_VENDOR | 所用 JDK port 的供应商 (例如 'sun')。 |
JAVA_PORT_OS_DESCRIPTION | 所用 JDK port 操作系统的描述 (例如 'Linux')。 |
JAVA_PORT_VENDOR_DESCRIPTION | 所用 JDK port 供应商的描述 (例如 'FreeBSD Foundation')。 |
JAVA_HOME | JDK 的安装目录 (例如 '/usr/local/jdk1.3.1')。 |
JAVAC | 所用 Java 编译器的完整路径 (例如 '/usr/local/jdk1.3.1/bin/javac' 或 '/usr/local/bin/jikes')。 |
JAR | 所用 jar 工具的完整路径 (例如 '/usr/local/jdk1.3.1/bin/jar' 或 '/usr/local/bin/fastjar')。 |
APPLETVIEWER | 所用 appletviewer 工具的完整路径 (例如 '/usr/local/linux-jdk1.3.1/bin/appletviewer')。 |
JAVA | 所用 java 执行文件的完整路径。 您应使用它来执行 Java 程序 (例如 '/usr/local/jdk1.3.1/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。 |
HAVE_JIKES | 随 jikes 是否将被应用于 port 的联编过程而定 (参见前述 USE_JIKES)。 |
您可以使用 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 中。
如果 port 采用 Apache Ant 进行联编, 则需要定义 USE_ANT。 如是, 则 Ant 将作为 子-make 命令来使用。 如果 port 未定义 do-build target, 则将默认依 MAKE_ENV、 MAKE_ARGS 和 ALL_TARGET。 的设置执行 Ant。 这类似于 第 6.3 节 中介绍的关于 USE_GMAKE 的机制。
若 jikes 被作为 javac 使用 (参见 第 6.11.1 节 中的 USE_JIKES), 则 Ant 会自动将其用于 port 的联编过程。
如果您正移植某个 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 中的使用规则。