建置 Arrow Java#
系統設定#
Arrow Java 使用 Maven 建置系統。
建置需求
JDK 11+
Maven 3+
注意
CI 將測試所有支援的 JDK LTS 版本,以及最新的非 LTS 版本。
建置#
以下所有指示皆假設您已克隆 Arrow git 儲存庫
$ git clone https://github.com/apache/arrow.git
$ cd arrow
$ git submodule update --init --recursive
以下是可用的選項,用於編譯 Arrow Java 模組:
Maven 建置工具。
Docker Compose。
Archery。
建置 Java 模組#
若要建置預設模組,請前往專案根目錄並執行
Maven#
$ cd arrow/java
$ export JAVA_HOME=<absolute path to your java home>
$ java --version
$ mvn clean install
Docker compose#
$ cd arrow/java
$ export JAVA_HOME=<absolute path to your java home>
$ java --version
$ docker compose run java
Archery#
$ cd arrow/java
$ export JAVA_HOME=<absolute path to your java home>
$ java --version
$ archery docker run java
建置 JNI 函式庫 (*.dylib / *.so / *.dll)#
首先,我們需要建置 C++ 共享函式庫,JNI 綁定將會使用。我們可以手動建置這些,或者我們可以使用 Archery,透過 Docker 容器來建置它們(這將需要安裝 Docker、Docker Compose 和 Archery)。
注意
如果您在 Apple Silicon 上建置,請務必使用為該架構編譯的 JDK 版本。例如,請參閱 Azul JDK。
如果您在 Windows 作業系統上建置,請參閱 在 Windows 上開發。
Maven#
若要僅建置 JNI C 資料介面函式庫 (macOS / Linux)
$ cd arrow/java $ export JAVA_HOME=<absolute path to your java home> $ java --version $ mvn generate-resources -Pgenerate-libs-cdata-all-os -N $ ls -latr ../java-dist/lib |__ arrow_cdata_jni/
若要僅建置 JNI C 資料介面函式庫 (Windows)
$ cd arrow/java $ mvn generate-resources -Pgenerate-libs-cdata-all-os -N $ dir "../java-dist/bin" |__ arrow_cdata_jni/
若要建置除了 JNI C 資料介面函式庫以外的所有 JNI 函式庫 (macOS / Linux)
$ cd arrow/java $ export JAVA_HOME=<absolute path to your java home> $ java --version $ mvn generate-resources -Pgenerate-libs-jni-macos-linux -N $ ls -latr java-dist/lib |__ arrow_dataset_jni/ |__ arrow_orc_jni/ |__ gandiva_jni/
若要建置除了 JNI C 資料介面函式庫以外的所有 JNI 函式庫 (Windows)
$ cd arrow/java $ mvn generate-resources -Pgenerate-libs-jni-windows -N $ dir "../java-dist/bin" |__ arrow_dataset_jni/
CMake#
若要僅建置 JNI C 資料介面函式庫 (macOS / Linux)
$ cd arrow $ mkdir -p java-dist java-cdata $ cmake \ -S java \ -B java-cdata \ -DARROW_JAVA_JNI_ENABLE_C=ON \ -DARROW_JAVA_JNI_ENABLE_DEFAULT=OFF \ -DBUILD_TESTING=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=java-dist $ cmake --build java-cdata --target install --config Release $ ls -latr java-dist/lib |__ arrow_cdata_jni/
若要僅建置 JNI C 資料介面函式庫 (Windows)
$ cd arrow $ mkdir java-dist, java-cdata $ cmake ^ -S java ^ -B java-cdata ^ -DARROW_JAVA_JNI_ENABLE_C=ON ^ -DARROW_JAVA_JNI_ENABLE_DEFAULT=OFF ^ -DBUILD_TESTING=OFF ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_INSTALL_PREFIX=java-dist $ cmake --build java-cdata --target install --config Release $ dir "java-dist/bin" |__ arrow_cdata_jni/
若要建置除了 JNI C 資料介面函式庫以外的所有 JNI 函式庫 (macOS / Linux)
$ cd arrow $ brew bundle --file=cpp/Brewfile # Homebrew Bundle complete! 25 Brewfile dependencies now installed. $ brew uninstall aws-sdk-cpp # (We can't use aws-sdk-cpp installed by Homebrew because it has # an issue: https://github.com/aws/aws-sdk-cpp/issues/1809 ) $ export JAVA_HOME=<absolute path to your java home> $ mkdir -p java-dist cpp-jni $ cmake \ -S cpp \ -B cpp-jni \ -DARROW_BUILD_SHARED=OFF \ -DARROW_CSV=ON \ -DARROW_DATASET=ON \ -DARROW_DEPENDENCY_SOURCE=BUNDLED \ -DARROW_DEPENDENCY_USE_SHARED=OFF \ -DARROW_FILESYSTEM=ON \ -DARROW_GANDIVA=ON \ -DARROW_GANDIVA_STATIC_LIBSTDCPP=ON \ -DARROW_JSON=ON \ -DARROW_ORC=ON \ -DARROW_PARQUET=ON \ -DARROW_S3=ON \ -DARROW_SUBSTRAIT=ON \ -DARROW_USE_CCACHE=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=java-dist \ -DCMAKE_UNITY_BUILD=ON $ cmake --build cpp-jni --target install --config Release $ cmake \ -S java \ -B java-jni \ -DARROW_JAVA_JNI_ENABLE_C=OFF \ -DARROW_JAVA_JNI_ENABLE_DEFAULT=ON \ -DBUILD_TESTING=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=java-dist \ -DCMAKE_PREFIX_PATH=$PWD/java-dist \ -DProtobuf_ROOT=$PWD/../cpp-jni/protobuf_ep-install \ -DProtobuf_USE_STATIC_LIBS=ON $ cmake --build java-jni --target install --config Release $ ls -latr java-dist/lib/ |__ arrow_dataset_jni/ |__ arrow_orc_jni/ |__ gandiva_jni/
若要建置除了 JNI C 資料介面函式庫以外的所有 JNI 函式庫 (Windows)
$ cd arrow $ mkdir java-dist, cpp-jni $ cmake ^ -S cpp ^ -B cpp-jni ^ -DARROW_BUILD_SHARED=OFF ^ -DARROW_CSV=ON ^ -DARROW_DATASET=ON ^ -DARROW_DEPENDENCY_USE_SHARED=OFF ^ -DARROW_FILESYSTEM=ON ^ -DARROW_GANDIVA=OFF ^ -DARROW_JSON=ON ^ -DARROW_ORC=ON ^ -DARROW_PARQUET=ON ^ -DARROW_S3=ON ^ -DARROW_SUBSTRAIT=ON ^ -DARROW_USE_CCACHE=ON ^ -DARROW_WITH_BROTLI=ON ^ -DARROW_WITH_LZ4=ON ^ -DARROW_WITH_SNAPPY=ON ^ -DARROW_WITH_ZLIB=ON ^ -DARROW_WITH_ZSTD=ON ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_INSTALL_PREFIX=java-dist ^ -DCMAKE_UNITY_BUILD=ON ^ -GNinja $ cd cpp-jni $ ninja install $ cd ../ $ cmake ^ -S java ^ -B java-jni ^ -DARROW_JAVA_JNI_ENABLE_C=OFF ^ -DARROW_JAVA_JNI_ENABLE_DATASET=ON ^ -DARROW_JAVA_JNI_ENABLE_DEFAULT=ON ^ -DARROW_JAVA_JNI_ENABLE_GANDIVA=OFF ^ -DARROW_JAVA_JNI_ENABLE_ORC=ON ^ -DBUILD_TESTING=OFF ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_INSTALL_PREFIX=java-dist ^ -DCMAKE_PREFIX_PATH=$PWD/java-dist $ cmake --build java-jni --target install --config Release $ dir "java-dist/bin" |__ arrow_orc_jni/ |__ arrow_dataset_jni/
Archery#
$ cd arrow
$ archery docker run java-jni-manylinux-2014
$ ls -latr java-dist
|__ arrow_cdata_jni/
|__ arrow_dataset_jni/
|__ arrow_orc_jni/
|__ gandiva_jni/
建置 Java JNI 模組#
若要編譯 JNI 綁定,請使用
arrow-c-data
Maven Profile$ cd arrow/java $ mvn -Darrow.c.jni.dist.dir=<absolute path to your arrow folder>/java-dist/lib -Parrow-c-data clean install
若要編譯 ORC / Gandiva / Dataset 的 JNI 綁定,請使用
arrow-jni
Maven Profile$ cd arrow/java $ mvn \ -Darrow.cpp.build.dir=<absolute path to your arrow folder>/java-dist/lib/ \ -Darrow.c.jni.dist.dir=<absolute path to your arrow folder>/java-dist/lib/ \ -Parrow-jni clean install
測試#
預設情況下,Maven 會使用相同的 Java 版本來建置程式碼和執行測試。
也可以為測試使用不同的 JDK 版本。這需要事先設定 Maven Toolchains,然後設定特定的測試屬性。
設定 Maven Toolchains#
為了能夠使用 JDK 版本進行測試,需要先在 Maven toolchains.xml
設定檔中註冊,通常位於 ${HOME}/.m2
下,並在其中加入以下程式碼片段
<?xml version="1.0" encoding="UTF8"?> <toolchains> [...] <toolchain> <type>jdk</type> <provides> <version>21</version> <!-- Replace with the corresponding JDK version: 11, 17, ... --> <vendor>temurin</vendor> <!-- Replace with the vendor/distribution: temurin, oracle, zulu ... --> </provides> <configuration> <jdkHome>path/to/jdk/home</jdkHome> <!-- Replace with the path to the JDK --> </configuration> </toolchain> [...] </toolchains>
使用特定 JDK 進行測試#
若要使用特定 JDK 版本執行 Arrow 測試,請使用 arrow.test.jdk-version
屬性。
例如,若要使用 JDK 17 執行 Arrow 測試,請使用以下程式碼片段
$ cd arrow/java $ mvn -Darrow.test.jdk-version=17 clean verify
IDE 設定#
IntelliJ#
若要在 IntelliJ 中開始使用 Arrow:先從命令列使用 mvn clean install
建置專案一次。然後開啟 Arrow 儲存庫的 java/
子目錄,並更新以下設定
在「檔案」工具視窗中,找到路徑
vector/target/generated-sources
,在目錄上按一下滑鼠右鍵,然後選取「標記目錄為」>「產生的來源根目錄」。無需標記其他產生的來源目錄,因為只有vector
模組會產生來源。對於 JDK 11,由於 IntelliJ 錯誤,您必須進入「設定」>「建置、執行、部署」>「編譯器」>「Java 編譯器」,並停用「針對交叉編譯使用 ‘–release’ 選項 (Java 9 及更新版本)」。否則您會收到類似「套件 sun.misc 不存在」的錯誤。
如果 error-prone 發出偽造警告,您可能想要完全停用它(在 Maven 工具視窗中停用 error-prone 設定檔和「重新載入所有 Maven 專案」)。
如果使用 IntelliJ 的 Maven 整合功能來建置,您可能需要由於 IntelliJ 錯誤,將 pom.xml 檔案中的
<fork>
變更為false
。若要啟用偵錯 JNI 基礎模組 (例如
dataset
),請在「設定檔」下的 Maven 標籤中啟用特定設定檔。確保啟用arrow-c-data
、arrow-jni
、generate-libs-cdata-all-os
、generate-libs-jni-macos-linux
和jdk11+
設定檔,以便 IDE 可以建置它們並啟用偵錯。
如果您使用 IntelliJ Maven 整合功能而非直接使用 IntelliJ 進行建置/測試,您可能不需要更新所有這些設定。
常見錯誤#
當使用 JNI 程式碼時:如果 C++ 建置找不到相依性,並出現如下錯誤
Could NOT find Boost (missing: Boost_INCLUDE_DIR system filesystem) Could NOT find Lz4 (missing: LZ4_LIB) Could NOT find zstd (missing: ZSTD_LIB)
指定應在建置時下載相依性(更多詳細資訊請參閱〈相依性解析〉)
-Dre2_SOURCE=BUNDLED \ -DBoost_SOURCE=BUNDLED \ -Dutf8proc_SOURCE=BUNDLED \ -DSnappy_SOURCE=BUNDLED \ -DORC_SOURCE=BUNDLED \ -DZLIB_SOURCE=BUNDLED
安裝每夜建置套件#
警告
這些套件並非官方發行版本。使用風險自負。
Arrow 每夜建置會發布在郵寄清單 builds@arrow.apache.org 上。成品會上傳到 GitHub。例如,對於 2022/07/30,可以在 GitHub Nightly 中找到它們。
從 Apache 每夜建置安裝#
查閱所使用 Arrow 函式庫的每夜建置版本號碼。
例如,對於
arrow-memory
,請造訪 https://nightlies.apache.org/arrow/java/org/apache/arrow/arrow-memory/ 並查看有哪些版本可用(例如 9.0.0.dev501)。將 Apache 每夜建置儲存庫新增至 Maven/Gradle 專案。
<properties> <arrow.version>9.0.0.dev501</arrow.version> </properties> ... <repositories> <repository> <id>arrow-apache-nightlies</id> <url>https://nightlies.apache.org/arrow/java</url> </repository> </repositories> ... <dependencies> <dependency> <groupId>org.apache.arrow</groupId> <artifactId>arrow-vector</artifactId> <version>${arrow.version}</version> </dependency> </dependencies> ...
手動安裝#
決定要使用的每夜建置套件儲存庫,例如:ursacomputing/crossbow
將套件新增至您的 pom.xml,例如:flight-core(它相依於:arrow-format、arrow-vector、arrow-memory-core 和 arrow-memory-netty)。
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <arrow.version>9.0.0.dev501</arrow.version> </properties> <dependencies> <dependency> <groupId>org.apache.arrow</groupId> <artifactId>flight-core</artifactId> <version>${arrow.version}</version> </dependency> </dependencies>
將必要的 pom 和 jar 檔案下載到暫存目錄
$ mkdir nightly-packaging-2022-07-30-0-github-java-jars $ cd nightly-packaging-2022-07-30-0-github-java-jars $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-java-root-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-format-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-format-9.0.0.dev501.jar $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-vector-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-vector-9.0.0.dev501.jar $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-memory-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-memory-core-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-memory-netty-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-memory-core-9.0.0.dev501.jar $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-memory-netty-9.0.0.dev501.jar $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/arrow-flight-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/flight-core-9.0.0.dev501.pom $ wget https://github.com/ursacomputing/crossbow/releases/download/nightly-packaging-2022-07-30-0-github-java-jars/flight-core-9.0.0.dev501.jar $ tree . ├── arrow-flight-9.0.0.dev501.pom ├── arrow-format-9.0.0.dev501.jar ├── arrow-format-9.0.0.dev501.pom ├── arrow-java-root-9.0.0.dev501.pom ├── arrow-memory-9.0.0.dev501.pom ├── arrow-memory-core-9.0.0.dev501.jar ├── arrow-memory-core-9.0.0.dev501.pom ├── arrow-memory-netty-9.0.0.dev501.jar ├── arrow-memory-netty-9.0.0.dev501.pom ├── arrow-vector-9.0.0.dev501.jar ├── arrow-vector-9.0.0.dev501.pom ├── flight-core-9.0.0.dev501.jar └── flight-core-9.0.0.dev501.pom
使用
mvn install:install-file
將成品安裝到本機 Maven 儲存庫$ mvn install:install-file -Dfile="$(pwd)/arrow-java-root-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-java-root -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/arrow-format-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-format -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/arrow-format-9.0.0.dev501.jar" -DgroupId=org.apache.arrow -DartifactId=arrow-format -Dversion=9.0.0.dev501 -Dpackaging=jar $ mvn install:install-file -Dfile="$(pwd)/arrow-vector-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-vector -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/arrow-vector-9.0.0.dev501.jar" -DgroupId=org.apache.arrow -DartifactId=arrow-vector -Dversion=9.0.0.dev501 -Dpackaging=jar $ mvn install:install-file -Dfile="$(pwd)/arrow-memory-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-memory -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/arrow-memory-core-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-memory-core -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/arrow-memory-netty-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-memory-netty -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/arrow-memory-core-9.0.0.dev501.jar" -DgroupId=org.apache.arrow -DartifactId=arrow-memory-core -Dversion=9.0.0.dev501 -Dpackaging=jar $ mvn install:install-file -Dfile="$(pwd)/arrow-memory-netty-9.0.0.dev501.jar" -DgroupId=org.apache.arrow -DartifactId=arrow-memory-netty -Dversion=9.0.0.dev501 -Dpackaging=jar $ mvn install:install-file -Dfile="$(pwd)/arrow-flight-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=arrow-flight -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/flight-core-9.0.0.dev501.pom" -DgroupId=org.apache.arrow -DartifactId=flight-core -Dversion=9.0.0.dev501 -Dpackaging=pom $ mvn install:install-file -Dfile="$(pwd)/flight-core-9.0.0.dev501.jar" -DgroupId=org.apache.arrow -DartifactId=flight-core -Dversion=9.0.0.dev501 -Dpackaging=jar
驗證套件已安裝
$ tree ~/.m2/repository/org/apache/arrow . ├── arrow-flight │ ├── 9.0.0.dev501 │ │ └── arrow-flight-9.0.0.dev501.pom ├── arrow-format │ ├── 9.0.0.dev501 │ │ ├── arrow-format-9.0.0.dev501.jar │ │ └── arrow-format-9.0.0.dev501.pom ├── arrow-java-root │ ├── 9.0.0.dev501 │ │ └── arrow-java-root-9.0.0.dev501.pom ├── arrow-memory │ ├── 9.0.0.dev501 │ │ └── arrow-memory-9.0.0.dev501.pom ├── arrow-memory-core │ ├── 9.0.0.dev501 │ │ ├── arrow-memory-core-9.0.0.dev501.jar │ │ └── arrow-memory-core-9.0.0.dev501.pom ├── arrow-memory-netty │ ├── 9.0.0.dev501 │ │ ├── arrow-memory-netty-9.0.0.dev501.jar │ │ └── arrow-memory-netty-9.0.0.dev501.pom ├── arrow-vector │ ├── 9.0.0.dev501 │ │ ├── _remote.repositories │ │ ├── arrow-vector-9.0.0.dev501.jar │ │ └── arrow-vector-9.0.0.dev501.pom └── flight-core ├── 9.0.0.dev501 │ ├── flight-core-9.0.0.dev501.jar │ └── flight-core-9.0.0.dev501.pom
像往常一樣使用
mvn clean install
編譯您的專案。
安裝預發布套件#
警告
這些套件並非官方發行版本。使用風險自負。
當準備發行候選版本 (RC) 時,會建立 Arrow 預發布建置。這可讓使用者在投票決定發行版本之前,在其應用程式中測試 RC。
從 Apache 預發布安裝#
查閱所使用 Arrow 函式庫的下一個版本號碼。
將 Apache 預發布儲存庫新增至 Maven/Gradle 專案。
<properties> <arrow.version>9.0.0</arrow.version> </properties> ... <repositories> <repository> <id>arrow-apache-staging</id> <url>https://repository.apache.org/content/repositories/staging</url> </repository> </repositories> ... <dependencies> <dependency> <groupId>org.apache.arrow</groupId> <artifactId>arrow-vector</artifactId> <version>${arrow.version}</version> </dependency> </dependencies> ...