FreeBSD Porter 手册
上一页 | 第6章 　特殊情况 | 下一页

# 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.1[+] 1.2[+] 1.3[+] 1.4[+]`)。
`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` 中。

## 6.11.2 采用 Ant 进行联编

如果 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 的联编过程。

## 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 中的使用规则。

上一页 | 起始页 | 下一页
使用 KDE | 上一级 | Web 应用， Apache 和 PHP

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