UseJava¶
此文件提供对 Java 的支持。假定 FindJava 模块已加载。有关如何将 Java 加载到 CMake 项目的信息,请参阅 FindJava。
在 CMake 项目中加载此模块,使用
include(UseJava)
概要¶
Creating and Installing JARS add_jar (<target_name> [SOURCES] <source1> [<source2>...] ...) install_jar (<target_name> DESTINATION <destination> [COMPONENT <component>]) install_jni_symlink (<target_name> DESTINATION <destination> [COMPONENT <component>]) Header Generation create_javah ((TARGET <target> | GENERATED_FILES <VAR>) CLASSES <class>... ...) Exporting JAR Targets install_jar_exports (TARGETS <jars>... FILE <filename> DESTINATION <destination> ...) export_jars (TARGETS <jars>... [NAMESPACE <namespace>] FILE <filename>) Finding JARs find_jar (<VAR> NAMES <name1> [<name2>...] [PATHS <path1> [<path2>... ENV <var>]] ...) Creating Java Documentation create_javadoc (<VAR> (PACKAGES <pkg1> [<pkg2>...] | FILES <file1> [<file2>...]) ...)
创建和安装 JAR 文件¶
- add_jar¶
创建包含 Java 对象和可选资源的 jar 文件
add_jar(<target_name> [SOURCES] <source1> [<source2>...] [<resource1>...] [RESOURCES NAMESPACE <ns1> <resource1>... [NAMESPACE <nsX> <resourceX>...]... ] [INCLUDE_JARS <jar1> [<jar2>...]] [ENTRY_POINT <entry>] [VERSION <version>] [MANIFEST <manifest>] [OUTPUT_NAME <name>] [OUTPUT_DIR <dir>] [GENERATE_NATIVE_HEADERS <target> [DESTINATION (<dir>|INSTALL <dir> [BUILD <dir>])]] )
此命令会创建
<target_name>.jar文件。它会编译给定的<source>文件,并将给定的<resource>文件添加到 jar 文件中。源文件可以是 java 文件或列表文件(以@开头)。如果仅提供了资源文件,则仅创建 jar 文件。SOURCES编译指定的源文件并将结果添加到 jar 文件中。
Added in version 3.4: 支持响应文件,以
@为前缀。RESOURCES3.21 版本新增。
通过剥离源文件路径并将文件放置在 jar 中的
<ns>下,将指定的<resource>文件添加到 jar 中。例如
RESOURCES NAMESPACE "/com/my/namespace" "a/path/to/resource.txt"
结果是可通过 jar 文件中的
/com/my/namespace/resource.txt访问的资源。可以通过将资源添加到
SOURCES列表(原始行为)来添加资源,而无需调整命名空间。在这种情况下,资源路径必须相对于CMAKE_CURRENT_SOURCE_DIR。在“out of source”构建中添加资源而不使用RESOURCES参数几乎肯定会引起混淆。注意
通过
SOURCES参数添加资源依赖于一个硬编码的文件扩展名列表,该列表用于确定它们是否可编译(例如,File.java)。匹配扩展名的SOURCES文件将被编译。不匹配的文件被视为资源。要包含匹配这些文件扩展名的未编译资源,请使用RESOURCES参数。INCLUDE_JARS在编译 Java 源文件时,将 JAR 文件列表添加到类路径,同时也会添加到目标的依赖项中。
INCLUDE_JARS也接受由add_jar()创建的其他目标名称。为了向后兼容,作为源文件的 JAR 文件将被忽略(自该模块首次发布以来一直如此)。ENTRY_POINT在 jar 文件中定义一个入口点。
VERSION为目标输出名称添加版本信息。
下面的示例将创建一个名为
shibboleet-1.2.0.jar的 jar 文件,并创建一个名为shibboleet.jar的符号链接,指向带有版本信息的 jar 文件。add_jar(shibboleet shibbotleet.java VERSION 1.2.0)
MANIFEST定义 jar 的自定义 manifest 文件。
OUTPUT_NAME为目标指定不同的输出名称。
OUTPUT_DIR设置生成 jar 文件的目录。如果未指定,则使用
CMAKE_CURRENT_BINARY_DIR作为输出目录。GENERATE_NATIVE_HEADERS3.11 版本新增。
为声明为 native 的方法生成 native 头文件。这些文件提供了允许 Java 代码和 C 代码交互的连接。将创建一个 INTERFACE 目标,以便于使用生成的文件。子选项
DESTINATION可用于指定生成头文件的输出目录。此选项至少需要 JDK 1.8 版本。
为了最佳地使用此选项,建议在调用
add_jar()之前的任何地方包含 JNI 模块。然后,可以使用生成的 native 头文件的目标通过target_link_libraries()命令编译 C/C++ 源文件。find_package(JNI) add_jar(foo foo.java GENERATE_NATIVE_HEADERS foo-native) add_library(bar bar.cpp) target_link_libraries(bar PRIVATE foo-native)
Added in version 3.20:
DESTINATION子选项现在支持为BUILD和INSTALL步骤指定不同的输出目录。如果未指定BUILD目录,将使用默认目录。要导出
GENERATE_NATIVE_HEADERS选项生成的接口目标,需要DESTINATION的INSTALL子选项。add_jar(foo foo.java GENERATE_NATIVE_HEADERS foo-native DESTINATION INSTALL include) install(TARGETS foo-native EXPORT native) install(DIRECTORY "$<TARGET_PROPERTY:foo-native,NATIVE_HEADERS_DIRECTORY>/" DESTINATION include) install(EXPORT native DESTINATION /to/export NAMESPACE foo)
可以设置一些变量来定制
add_jar()以及 Java 编译器的行为。CMAKE_JAVA_COMPILE_FLAGS指定传递给 Java 编译器的附加标志。
CMAKE_JAVA_INCLUDE_PATH指定类路径的附加路径。
CMAKE_JNI_TARGET如果目标是 JNI 库,则将此布尔变量设置为
TRUE以启用 JNI 符号链接的创建(另请参阅 install_jni_symlink())。CMAKE_JAR_CLASSES_PREFIX如果应从同一 Java 源文件树生成多个 jar,为了防止在后续 jar 中累积重复的类文件,请在调用
add_jar()之前设置/重置CMAKE_JAR_CLASSES_PREFIX。set(CMAKE_JAR_CLASSES_PREFIX com/redhat/foo) add_jar(foo foo.java) set(CMAKE_JAR_CLASSES_PREFIX com/redhat/bar) add_jar(bar bar.java)
add_jar()函数在<target_name>上设置以下目标属性:INSTALL_FILES应安装的文件。此项由 install_jar() 使用。
JNI_SYMLINK应安装的 JNI 符号链接。此项由 install_jni_symlink() 使用。
JAR_FILEjar 文件的位置,以便您可以包含它。
CLASSDIR可以找到类文件的目录。例如,将其与
javah一起使用。NATIVE_HEADERS_DIRECTORY在 3.20 版本中添加。
生成 native 头文件的目录。在指定
GENERATE_NATIVE_HEADERS选项时定义。
- install_jar¶
此命令将 jar 文件安装到指定的目标位置
install_jar(<target_name> <destination>) install_jar(<target_name> DESTINATION <destination> [COMPONENT <component>])
此命令将
<target_name>文件安装到指定的<destination>。它应在与 add_jar() 相同的范围内调用,否则会失败。Added in version 3.4: 带有
DESTINATION和COMPONENT选项的第二个签名。DESTINATION指定文件将要安装到的磁盘目录。
COMPONENT指定一个安装组件名称,安装规则与之相关联,例如“runtime”或“development”。
此命令将
install_jar()命令在<target_name>上设置以下目标属性:INSTALL_DESTINATION包含上面描述的
<destination>,并由 install_jar_exports() 使用。
- install_jni_symlink¶
为 add_jar() 生成的目标安装 JNI 符号链接
install_jni_symlink(<target_name> <destination>) install_jni_symlink(<target_name> DESTINATION <destination> [COMPONENT <component>])
此命令将
<target_name>的 JNI 符号链接安装到指定的<destination>。它应在与 add_jar() 相同的范围内调用,否则会失败。Added in version 3.4: 带有
DESTINATION和COMPONENT选项的第二个签名。DESTINATION指定文件将要安装到的磁盘目录。
COMPONENT指定一个安装组件名称,安装规则与之相关联,例如“runtime”或“development”。
使用以下命令创建 JNI 符号链接。
set(CMAKE_JNI_TARGET TRUE) add_jar(shibboleet shibbotleet.java VERSION 1.2.0) install_jar(shibboleet ${LIB_INSTALL_DIR}/shibboleet) install_jni_symlink(shibboleet ${JAVA_LIB_INSTALL_DIR})
头文件生成¶
- create_javah¶
3.4 版本新增。
为 Java 类生成 C 头文件
create_javah(TARGET <target> | GENERATED_FILES <VAR> CLASSES <class>... [CLASSPATH <classpath>...] [DEPENDS <depend>...] [OUTPUT_NAME <path>|OUTPUT_DIR <path>] )
Deprecated since version 3.11: 由于 javah 工具的移除,此命令在 JDK 10 版本之后将不再受支持。应使用 add_jar(GENERATE_NATIVE_HEADERS) 命令代替。
从 Java 类创建 C 头文件。这些文件提供了允许 Java 代码和 C 代码交互的连接。
create_javah()有两个主要签名。第一个签名通过GENERATED_FILES选项指定的变量返回生成的文件。例如:create_javah(GENERATED_FILES files_headers CLASSES org.cmake.HelloWorld CLASSPATH hello.jar )
create_javah()的第二个签名创建一个封装头文件生成的目标。例如:create_javah(TARGET target_headers CLASSES org.cmake.HelloWorld CLASSPATH hello.jar )
两个签名共享相同的选项。
CLASSES指定用于生成头文件的 Java 类。
CLASSPATH指定查找类的各种路径。这里可以使用
.class文件、jar 文件或add_jar命令创建的目标。DEPENDSjavah 目标所依赖的目标。
OUTPUT_NAME将选项
CLASSES列出的所有类的结果头文件连接到<path>。与javah工具的-o选项行为相同。OUTPUT_DIR设置生成头文件的目录。与
javah工具的-d选项行为相同。如果未指定,则使用CMAKE_CURRENT_BINARY_DIR作为输出目录。
导出 JAR 目标¶
- install_jar_exports¶
3.7 版本中新增。
安装目标导出文件
install_jar_exports(TARGETS <jars>... [NAMESPACE <namespace>] FILE <filename> DESTINATION <destination> [COMPONENT <component>])
此命令为命名的 jar 目标将目标导出文件
<filename>安装到指定的<destination>目录。其功能类似于install(EXPORT)。TARGETS由 add_jar() 命令创建的目标列表。
NAMESPACE版本 3.9 中添加。
值
<namespace>将被添加到导入文件中写入的目标名称之前。FILE指定导出文件的名称。
DESTINATION指定文件将要安装到的磁盘目录。
COMPONENT指定一个安装组件名称,安装规则与之相关联,例如“runtime”或“development”。
查找 JAR 文件¶
- find_jar¶
查找指定的 jar 文件
find_jar(<VAR> <name> | NAMES <name1> [<name2>...] [PATHS <path1> [<path2>... ENV <var>]] [VERSIONS <version1> [<version2>]] [DOC "cache documentation string"] )
此命令用于查找指定 jar 的完整路径。将创建一个名为
<VAR>的缓存条目来存储此命令的结果。如果找到 jar 的完整路径,则结果将存储在变量中,并且除非清除该变量,否则不会重复搜索。如果未找到任何内容,结果将是<VAR>-NOTFOUND,并且下次使用相同变量调用find_jar()时将再次尝试搜索。NAMES指定 jar 文件的一个或多个可能名称。
PATHS指定除默认位置之外要搜索的目录。
ENVvar 子选项从系统环境变量中读取路径。VERSIONS指定 jar 版本。
DOC为
<VAR>缓存条目指定文档字符串。
创建 Java 文档¶
- create_javadoc¶
根据文件和包创建 Java 文档
create_javadoc(<VAR> (PACKAGES <pkg1> [<pkg2>...] | FILES <file1> [<file2>...]) [SOURCEPATH <sourcepath>] [CLASSPATH <classpath>] [INSTALLPATH <install path>] [DOCTITLE <the documentation title>] [WINDOWTITLE <the title of the document>] [AUTHOR (TRUE|FALSE)] [USE (TRUE|FALSE)] [VERSION (TRUE|FALSE)] )
create_javadoc()命令可用于创建 Java 文档。create_javadoc()有两个主要签名。第一个签名处理源文件路径上的包名称。
create_javadoc(my_example_doc PACKAGES com.example.foo com.example.bar SOURCEPATH "${CMAKE_CURRENT_SOURCE_DIR}" CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH} WINDOWTITLE "My example" DOCTITLE "<h1>My example</h1>" AUTHOR TRUE USE TRUE VERSION TRUE )
第二个签名
create_javadoc()在给定文件列表上操作。create_javadoc(my_example_doc FILES java/A.java java/B.java CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH} WINDOWTITLE "My example" DOCTITLE "<h1>My example</h1>" AUTHOR TRUE USE TRUE VERSION TRUE )
两个签名共享大部分选项。更多详细信息,请参阅 javadoc 手册页。
PACKAGES指定 Java 包。
FILES指定 Java 源文件。如果指定了相对路径,则它们相对于
CMAKE_CURRENT_SOURCE_DIR。SOURCEPATH指定查找包的目录。默认情况下,使用
CMAKE_CURRENT_SOURCE_DIR目录。CLASSPATH指定查找用户类文件的位置。与
javadoc工具的-classpath选项行为相同。INSTALLPATH指定安装 Java 文档的位置。如果指定,文档将被安装到
${CMAKE_INSTALL_PREFIX}/share/javadoc/<VAR>。DOCTITLE指定放在概述摘要文件顶部的标题。与
javadoc工具的-doctitle选项行为相同。WINDOWTITLE指定放在 HTML
<title>标签中的标题。与javadoc工具的-windowtitle选项行为相同。AUTHOR当指定值为
TRUE时,在生成的文档中包含@author文本。与javadoc工具的-author选项行为相同。USE当指定值为
TRUE时,创建类和包的使用页面。为每个已文档化的类和包包含一个使用页面。与javadoc工具的-use选项行为相同。VERSION当指定值为
TRUE时,在生成的文档中包含版本文本。与javadoc工具的-version选项行为相同。