ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 JVM 中使用 prql-java:PRQL 编译器 JNI 绑定的安装、配置与源码剖析

在 JVM 中使用 prql-java:PRQL 编译器 JNI 绑定的安装、配置与源码剖析 后端【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址https://gitcode.com/gh_mirrors/pr/prql点击查看免费下载导读prql-java是 PRQL 项目官方提供的 Java 绑定通过 JNIJava Native Interface把 Rust 编写的prqlc编译器暴露给 JVM 生态让 Java/Kotlin/Scala 应用可以直接把 PRQL 查询编译为指定方言的 SQL。本文以 prqlc/bindings/java/README.md 为主线完整覆盖其 API 签名、参数语义、本地构建安装、Maven 依赖声明与运行时配置并结合仓库中的 Rust JNI 实现、Java 原生库加载器与交叉编译脚本讲清这条Java → JNI → Rust → SQL调用链的每个环节读完即可在本地跑通PrqlCompiler.toSql。prql-java 是什么以 JNI 桥接 prqlc 与 JVMprql-java是prqlcRust 库的 Java 绑定位于仓库 prqlc/bindings/java/通过 JNI 在org.prql.prql4j.PrqlCompiler类上暴露三个 native 方法见 PrqlCompiler.javapublic static native String toSql(String query, String target, boolean format, boolean signature) throws Exception; public static native String toJson(String query) throws Exception; public static native String format(String query) throws Exception;三个方法的功能定位方法作用底层 prqlc 调用链toSql将 PRQL 查询编译为指定方言的 SQLprqlc::compile(query, options)toJson将 PRQL 解析为中间表示 PL再序列化为 JSONprql_to_pl→json::from_plformat对 PRQL 查询做格式化解析后重新打印prql_to_pl→pl_to_prql三个方法均声明throws Exception编译失败或参数非法时Rust 侧会向 JVM 抛出java.lang.Exception编译错误或java.lang.IllegalArgumentException参数错误这一点可以在 lib.rs 的错误处理路径中确认。三个核心参数target、format 与 signaturetoSql的四个参数决定了输出的形态语义如下queryPRQL 查询字符串例如from my_tabletarget目标方言名称字符串例如sql.mysql、sql.duckdb、sql.postgres。仓库内完整方言清单见 web/book/src/project/target.md可取值包括sql.clickhouse、sql.duckdb、sql.generic、sql.mysql、sql.postgres、sql.redshift、sql.sqlite等受支持方言以及sql.mssql、sql.ansi、sql.bigquery、sql.snowflake、sql.oracle等实现存在但测试覆盖较弱的方言format是否对生成的 SQL 进行美化排版pretty-print。为true时输出多行缩进格式例如SELECT\n *\nFROM\n my_tablesignature是否在 SQL 尾部追加-- Generated by PRQL compiler version:...这样的版本签名注释。target的解析在 Rust 侧由Target::from_str(target_str)完成见 lib.rs解析失败会抛出IllegalArgumentException: invalid target dialect: ...。format与signature分别映射到prqlc::Options的format与signature_comment字段其余选项取Default::default()当前display等字段尚未通过 Java API 暴露源码中留有TODO: add support for display注释。需要说明的是target方言列表以当前仓库实际编译进prqlc的方言为准可在 dialect.rs 中看到各方言实现与支持等级的完整映射。安装本地编译并安装到 Maven 仓库prql-java目前仍处于早期阶段README 明确说明still at an early stage需要本地编译且尚未发布到 Maven Central。构建步骤如下在java/目录即 prqlc/bindings/java/java/下执行# -Dgpg.skiptrue 是因为 java/pom.xml 把 maven-gpg-plugin 绑定到了 verify 阶段 # 而 install 阶段会执行 verify。 ./mvnw install -Dgpg.skiptrue两条需要留意的构建事实产物 jar 不内嵌原生库./mvnw install生成的 jar 只包含 Java 类不会把 Rust 编译出的动态库打包进去——只有deployprofile 下的cross.sh步骤才会把动态库填充到src/main/resources。因此日常使用需要把工作区target/release下的libprql_java放到java.library.path上GPG 签名钩子java/pom.xml 将maven-gpg-plugin绑定在verify阶段直接install会触发签名而失败所以官方命令显式加了-Dgpg.skiptrue。构建完成后在 Maven 工程中按 java/pom.xml 声明的坐标引入依赖。注意它的version当前为0.5.2与 PRQL 发布版本是独立维护的且目前没有随 release 自动递增dependency groupIdorg.prqllang/groupId artifactIdprql-java/artifactId version0.5.2/version /dependency使用示例与运行配置编译一段 PRQL 的最简 Java 程序import org.prql.prql4j.PrqlCompiler; class Main { public static void main(String[] args) throws Exception { String sql PrqlCompiler.toSql(from my_table, sql.mysql, true, true); System.out.println(sql); } }运行时必须让 JVM 能找到原生库通过-Djava.library.path指向 PRQL 工作区的target/releasejava -Djava.library.path/path/to/prql/target/release Main如果不配置java.library.path且 jar 内又没有内嵌动态库PrqlCompiler的静态初始化块会在加载原生库时失败抛出libprql_java-linux64.so was not found inside JAR之类的错误。原因在于 PrqlCompiler.java 的静态块会调用NativeLibraryLoader.loadLibrary(null)而加载器按系统库 → jar 内库的顺序兜底详见下文。仓库自带的单元测试 PrqlCompilerTest.java 演示了两种典型场景compile()toSql(from my_table, sql.mysql, true, true)返回的 SQL 去掉签名注释后应等于SELECT * FROM my_tablecompileWithError()对非法查询from table | filter id 1断言抛出Exception验证了错误会以 Java 异常形式向上传播。源码级剖析JNI 调用链与错误处理Rust 侧一个方法对应一个#[no_mangle]导出原生实现位于 prqlc/bindings/java/src/lib.rs每个 Java native 方法对应一个按 JNI 命名规范导出的 Rust 函数Java_org_prql_prql4j_PrqlCompiler_toSql读取query与target两个 JString解析方言构造prqlc::Options后调用prqlc::compileJava_org_prql_prql4j_PrqlCompiler_toJsonprql_to_pl后再经json::from_pl序列化Java_org_prql_prql4j_PrqlCompiler_formatprql_to_pl后再经pl_to_prql重新打印。错误处理策略清晰分层读取 JNI 字符串失败或target方言非法 →throw_illegal_argument抛java/lang/IllegalArgumentException编译结果Err(errors)→ 通过env.throw_new(java/lang/Exception, message)抛出java/lang/Exception错误信息由ErrorMessages的Display输出包含位置与诊断信息成功路径则把 RustString转成 JNIjstring返回。编译目标由 Cargo.toml 的crate-type [cdylib]决定产物是平台相关的动态库Linux 为libprql_java.soWindows 为prql_java.dllmacOS 为libprql_java.dylib。Java 侧三级回退的原生库加载器NativeLibraryLoader源码改编自 RocksDB 的加载器见 NativeLibraryLoader.java的加载顺序为System.loadLibrary(prql_java)—— 优先使用java.library.path上的动态库System.loadLibrary(jniLibraryName)—— 尝试按平台命名的静态库如prql_java-linux64、prql_java-win64macOS 的 fallback 名称prql_java-osx最后从 jar 内src/main/resources提取动态库到临时文件再System.load——这正是deployprofile 交叉编译产物被填充的位置。平台/架构/ libc 的判定由 Environment.java 完成它读取os.name、os.arch并通过ldd /usr/bin/env | grep -q musl检测 musl libc从而拼接出libprql_java-linux64.so、libprql_java-osx-arm64.dylib这类文件名。这就是默认构建不内嵌原生库时用户必须显式提供-Djava.library.path的根因。交叉编译cross.sh 产出多平台动态库DEVELOPMENT.md 说明了多平台动态库的构建流程Maven 通过exec-maven-plugin在generate-resources/generate-test-resources阶段调用 cross.sh借助 cross 工具链交叉编译多个 target并把产物按平台命名复制进java/src/main/resources/x86_64-unknown-linux-gnu→libprql_java-linux64.sox86_64-pc-windows-gnu→libprql_java-win64.dllaarch64-unknown-linux-gnu→libprql_java-linux-aarch64.somusl、macOS 等 target 在脚本中被注释说明当前默认产物覆盖范围有限。pom.xml中的deploy-snapshot与deployprofile 均会触发该脚本这也是 README 所说jar 不内嵌原生库、只有 deploy 的 cross.sh 会填充 resources的依据。当前状态与限制根据 README 与 DEVELOPMENT.md 可以确认以下几点现状早期阶段未发布到 Maven Centralorg.prqllang:prql-java目前没有发布产物必须本地构建后install到本地仓库使用原生库需要额外提供默认 jar 不含动态库消费者必须自行编译 Rust cdylib 并配置java.library.path版本独立维护pom.xml中的version0.5.2/version与 PRQL 发布版本解耦且当前没有自动 bump 机制发布流程尚未接线Maven Central 发布所需的环境变量Nexus 凭据、GPG 私钥等尚未配置。这些限制决定了当前最适合的使用方式在本地 PRQL 工作区完成prqlc与prql-java的构建后把生成的 jar 与动态库一并分发给 JVM 应用。随着项目后续补全发布流水线接入成本会进一步降低。参考路径速查绑定 README 与开发说明prqlc/bindings/java/README.md、prqlc/bindings/java/DEVELOPMENT.mdRust JNI 实现prqlc/bindings/java/src/lib.rsJava 侧类PrqlCompiler.java、NativeLibraryLoader.java、Environment.java构建与测试java/pom.xml、cross.sh、PrqlCompilerTest.java方言清单web/book/src/project/target.md、方言实现映射 prqlc/prqlc/src/sql/dialect.rs赞分享后端【免费下载链接】prqlPRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement项目地址https://gitcode.com/gh_mirrors/pr/prql点击查看免费下载相关推荐prql-java 的 JNI 绑定开发指南Rust 实现、Maven 交叉编译与发布现状prql java 的 JNI 绑定开发指南Rust 实现、Maven 交叉编译与发布现状 PRQLPipelined Relational Query L后端在 NVIDIA Jetson 上构建与安装 MXNet本机源码编译、Docker 交叉编译与 Python 绑定配置指南在 NVIDIA Jetson 上构建与安装 MXNet本机源码编译、Docker 交叉编译与 Python 绑定配置指南 本文是 MXNet 在 NVIDI深度学习人工智能机器学习分布式训练MXNet 在 Ubuntu 上的完整安装指南CUDA 配置、pip 快速安装与源码编译多语言绑定MXNet 在 Ubuntu 上的完整安装指南CUDA 配置、pip 快速安装与源码编译多语言绑定 本指南面向在 Ubuntu 16.04及部分 18.04深度学习机器学习人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表