使用Java¶
此文件提供对 Java 的支持。假设 FindJava 已经被加载。有关如何将 Java 加载到您的 CMake 项目中的信息,请参见:module:FindJava。
概要¶
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 文件。来源编译指定的源文件并将结果添加到 jar 文件中。
在 3.4 版本加入: 支持以“@”为前缀的响应文件。
资源在 3.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。在非源构建中添加资源而不使用“RESOURCES”参数几乎肯定会导致混淆。备注
通过
SOURCES参数添加资源依赖于一个硬编码的文件扩展名列表,这些文件扩展名经过测试以确定它们是否编译(例如 File.java)。编译匹配扩展名的SOURCES文件。不匹配的文件被视为资源。要包含与这些文件扩展名匹配的未编译资源,请使用“RESOURCES”参数。INCLUDE_JARSjar 列表在编译 java 源代码时添加到类路径中,也添加到目标的依赖项中。
INCLUDE_JARS还接受由add_jar()创建的其他目标名称。为了向后兼容,列为源的 jar 文件将被忽略(因为它们自本模块的第一个版本以来一直如此)。入口点在 jar 文件中定义入口点。
版本将版本添加到目标输出名称。
以下示例将创建一个名为“shibboleet-1.2.0.jar”的 jar 文件,并将创建一个符号链接“shibboleet.jar”指向带有版本信息的 jar。
add_jar(shibboleet shibbotleet.java VERSION 1.2.0)
清单为 jar 定义自定义清单。
OUTPUT_NAME为目标指定不同的输出名称。
输出目录设置将生成 jar 文件的目录。如果未指定,则使用
CMAKE_CURRENT_BINARY_DIR作为输出目录。GENERATE_NATIVE_HEADERS在 3.11 版本加入.
为声明为本机的方法生成本机头文件。这些文件提供了允许 Java 和 C 代码进行交互的连接胶水。将创建一个 INTERFACE 目标,以便轻松使用生成的文件。子选项
DESTINATION可用于指定生成的头文件的输出目录。此选项至少需要 1.8 版的 JDK。
为了最佳使用此选项,建议在调用 add_jar() 之前包含模块 JNI。然后可以使用为本机头文件生成的目标来使用
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)
在 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 符号链接的创建(另请参阅:ref:install_jni_symlink() <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_jar() 使用。
JNI_SYMLINK应该安装的 JNI 符号链接。这由 install_jni_symlink() 使用。
JAR_FILEjar 文件的位置,以便您可以包含它。
CLASSDIR可以找到类文件的目录。例如将它们与
javah一起使用。NATIVE_HEADERS_DIRECTORY在 3.20 版本加入.
生成本机标头的目录。在指定选项``GENERATE_NATIVE_HEADERS`` 时定义。
- install_jar¶
此命令将 jar 文件安装到给定目标:
install_jar(<target_name> <destination>) install_jar(<target_name> DESTINATION <destination> [COMPONENT <component>])
此命令将
<target_name>文件安装到给定的<destination>。它应该在与 add_jar() 相同的范围内调用,否则它将失败。在 3.4 版本加入: 带有``DESTINATION`` 和``COMPONENT`` 选项的第二个签名。
目的地指定磁盘上将安装文件的目录。
组件指定与安装规则关联的安装组件名称,例如“runtime”或“development”。
install_jar()命令在<target_name>上设置以下目标属性:安装目标如上所述保存
<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() 相同的范围内调用,否则它将失败。
在 3.4 版本加入: 带有``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>] )自 3.11 版本弃用: 由于 suppression of javah tool,从 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 )
两个签名共享相同的选项。
类指定用于生成标头的 Java 类。
类路径指定查找类的各种路径。这里可以使用
.class文件、jar 文件或通过命令 add_jar 创建的目标。取决于javah 目标所依赖的目标。
OUTPUT_NAME将选项“CLASSES”列出的所有类的结果头文件连接到“<path>”。与 javah` 工具的选项
-o行为相同。输出目录设置将生成头文件的目录。与 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)。目标add_jar() 命令创建的目标列表。
命名空间在 3.9 版本加入.
<namespace>值将在写入导入文件时添加到目标名称之前。文件指定导出文件的名称。
目的地指定磁盘上将安装文件的目录。
组件指定与安装规则关联的安装组件名称,例如“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()`` 时将再次尝试搜索。
名字为 jar 文件指定一个或多个可能的名称。
路径除默认位置外,还指定要搜索的目录。
ENVvar 子选项从系统环境变量中读取路径。版本指定 jar 版本。
文档为
<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 联机帮助页。
包裹指定 java 包。
文件指定 java 源文件。如果指定了相对路径,它们是相对于 CMAKE_CURRENT_SOURCE_DIR 的。
源路径指定查找包的目录。默认情况下,使用
CMAKE_CURRENT_SOURCE_DIR目录。类路径指定在何处查找用户类文件。与
javadoc工具的选项-classpath行为相同。安装路径指定安装 java 文档的位置。如果您指定,文档将安装到“${CMAKE_INSTALL_PREFIX}/share/javadoc/<VAR>”。
DOCTITLE指定要放在概览摘要文件顶部附近的标题。与
javadoc工具的选项-doctitle行为相同。窗口标题指定要放置在 HTML
<title>标记中的标题。与javadoc工具的选项-windowtitle行为相同。作者当指定值“TRUE”时,在生成的文档中包含“@author”文本。与 javadoc` 工具的选项
-author行为相同。使用当指定值
TRUE时,创建类和包使用页面。为每个记录的类和包包括一个使用页面。与“javadoc”工具的选项“-use”的行为相同。版本当指定值
TRUE时,在生成的文档中包含版本文本。与javadoc工具的选项-version行为相同。