安装 Java 模块#
系统兼容性#
Java 模块在 macOS 和 Linux 发行版上定期构建和测试。
Java 兼容性#
Java 模块与 JDK 11 及更高版本兼容。目前,JDK 版本 11、17、21 和最新版本在 CI 中进行了测试。
请注意,必须通过在 `java` 命令中添加 `--add-opens=java.base/java.nio=ALL-UNNAMED` 来公开某些 JDK 内部构件。
# Directly on the command line
$ java --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED -jar ...
# Indirectly via environment variables
$ env JDK_JAVA_OPTIONS="--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED" java -jar ...
否则,您可能会看到类似 `module java.base does not "opens java.nio" to unnamed module` 或 `module java.base does not "opens java.nio" to org.apache.arrow.memory.core` 的错误。
请注意,该命令已从 Arrow 15 及更早版本更改。如果您仍在使用该版本中的标志(`--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`),您将看到 `module java.base does not "opens java.nio" to org.apache.arrow.memory.core` 错误。
如果您正在使用 flight-core 或依赖模块,则需要标记 flight-core 可以读取未命名模块。 为 Flight 修改上述命令
# Directly on the command line
$ java --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED -jar ...
# Indirectly via environment variables
$ env JDK_JAVA_OPTIONS="--add-reads=org.apache.arrow.flight.core=ALL-UNNAMED --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED" java -jar ...
否则,您可能会看到类似以下错误:`java.lang.IllegalAccessError: superclass access check failed: class org.apache.arrow.flight.ArrowMessage$ArrowBufRetainingCompositeByteBuf (in module org.apache.arrow.flight.core) cannot access class io.netty.buffer.CompositeByteBuf (in unnamed module ...) because module org.apache.arrow.flight.core does not read unnamed module ...`
最后,如果您正在使用 arrow-dataset,您还需要声明需要公开 JDK 内部构件。 为 arrow-memory 修改上述命令
# Directly on the command line
$ java --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED -jar ...
# Indirectly via environment variables
$ env JDK_JAVA_OPTIONS="--add-opens=java.base/java.nio=org.apache.arrow.dataset,org.apache.arrow.memory.core,ALL-UNNAMED" java -jar ...
否则,您可能会看到类似以下错误:`java.lang.RuntimeException: java.lang.reflect.InaccessibleObjectException: Unable to make static void java.nio.Bits.reserveMemory(long,long) accessible: module java.base does not "opens java.nio" to module org.apache.arrow.dataset`
如果使用 Maven 和 Surefire 进行单元测试,则也必须将此参数添加到 Surefire 中。
从 Maven 安装#
默认情况下,Maven 将从中央存储库下载:https://repo.maven.apache.org/maven2/org/apache/arrow/
使用所需的 Java 模块配置您的 pom.xml,例如:arrow-vector 和 arrow-memory-netty。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<arrow.version>9.0.0</arrow.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-vector</artifactId>
<version>${arrow.version}</version>
</dependency>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-memory-netty</artifactId>
<version>${arrow.version}</version>
</dependency>
</dependencies>
</project>
已提供物料清单 (BOM) 模块来简化添加 Arrow 模块。 这消除了为每个模块指定版本的需要。上述内容的替代方案是
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<arrow.version>15.0.0</arrow.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-vector</artifactId>
</dependency>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-memory-netty</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>arrow-bom</artifactId>
<version>${arrow.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
要使用 Arrow Flight 依赖项,还要添加 `os-maven-plugin` 插件。 此插件会生成有用的平台相关属性,例如 `os.detected.name` 和 `os.detected.arch`,这些属性是解析 Flight 的传递依赖项所需的。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<arrow.version>9.0.0</arrow.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.arrow</groupId>
<artifactId>flight-core</artifactId>
<version>${arrow.version}</version>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.7.0</version>
</extension>
</extensions>
</build>
</project>
通过 Maven 运行单元测试时,必须添加 `--add-opens` 标志
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
<configuration>
<argLine>--add-opens=java.base/java.nio=ALL-UNNAMED</argLine>
</configuration>
</plugin>
</plugins>
</build>
或者可以通过环境变量添加它们,例如在执行代码时
JDK_JAVA_OPTIONS="--add-opens=java.base/java.nio=ALL-UNNAMED" mvn exec:java -Dexec.mainClass="YourMainCode"
从源码安装#
请参阅 Java 开发。
IDE 配置#
通常,不需要额外的配置。但是,请确保您的 Maven 或其他构建配置具有如上所述的 `--add-opens` 标志,以便 IDE 也能选择它并使用该标志运行测试。