首页/新闻资讯/正文详情

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

发布时间:2026/9/23 14:39:46 来源:云帆数科 栏目:资讯中心
在 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),仅供参考

相关推荐

Ternimal:基于 node-pty 的本地终端会话共享与 AI Agent 实时监督方案
Ternimal:基于 node-pty 的本地终端会话共享与 AI Agent 实时监督方案

1. Ternimal 不是另一个 SSH 客户端:它重构了“终端会话”的所有权边界Ternimal 这个名字乍看像 terminal 的变体,但它的核心动作——“手机扫码接管桌面终端会话”——已经彻底跳出了传统远程终端的思维框架。它不解决“怎么连上服务器”,而… · 2026/9/23 14:39:46

DeskcommCRM自托管全攻略:部署、数据主权与团队权限
DeskcommCRM自托管全攻略:部署、数据主权与团队权限

做自托管的朋友应该都有同感:市面上叫得上名字的CRM,要么按人头按月收费,费用随着团队扩张水涨船高;要么数据锁在别人服务器上,每次想导出或者做二次开发,都得看平台脸色。我今年在评估销售团队的管理工具时… · 2026/9/23 14:39:40

ps怎么做印章手写实现:3个避坑指南让性能提升10倍
ps怎么做印章手写实现:3个避坑指南让性能提升10倍

ps怎么做印章手写实现:3个避坑指南让性能提升10倍 配置环境就卡半天?别慌。很多转岗做前端或后端的朋友,一接触图像处理就头大,装库、配依赖、调参数,半天过去了代码还没跑通。这篇避坑指南,直接给你能跑通的代码和性能数据,不整虚的。… · 2026/9/23 14:39:40

moto z 2018 面试避坑指南与完整示例实战
moto z 2018 面试避坑指南与完整示例实战

moto z 2018 面试避坑指南与完整示例实战 面试被问“底层数据流转机制”时,你答不上来?别慌,这通常是理论没结合实战导致的。很多开发者对 moto z 2018… · 2026/9/23 15:16:25

连锁店管理系统避坑指南:新手从零到一实战
连锁店管理系统避坑指南:新手从零到一实战

连锁店管理系统避坑指南:新手从零到一实战 看了一堆视频,代码还是敲不出来?别急,这很正常。很多兄弟刚接触连锁店管理系统开发,脑子里全是“库存”、“多店同步”这些大词,手却只会写 Hello World… · 2026/9/23 15:16:19

Java 性能优化:oldest 缓存策略避坑指南
Java 性能优化:oldest 缓存策略避坑指南

Java 性能优化:oldest 缓存策略避坑指南 昨晚上线新功能,CPU 直接飙到 90%,报警短信响个不停。点开监控面板,一眼看到堆内存里躺着几万个没释放的对象,StackTrace… · 2026/9/23 15:16:19

CTF Misc方向从入门到精通:最容易上手的“送分题“,也是宝藏方向
CTF Misc方向从入门到精通:最容易上手的“送分题“,也是宝藏方向

CTF五个方向:Web、Pwn、Reverse、Crypto、Misc——哪个最适合新手起步?答案是Misc。 Misc(杂项):图片隐写、流量分析、编码解码、文件分析——脑洞大开、工具丰富、上手最快。 它被叫"送分题",但… · 2026/9/23 15:16:13

高铁视频监控智能识别预警系统实战:入侵检测、行人检测与误检滤除
高铁视频监控智能识别预警系统实战:入侵检测、行人检测与误检滤除

简介:这份PDF文献聚焦高铁视频监控智能识别预警系统在沪杭客专的实际应用,面向铁路安全管理人员、轨道交通智能化研究者及人工智能工程技术人员,系统阐述了如何借助视频分发、机器视觉与模式识别技术解决高铁沿线人员侵限、异物侵入和设备形位… · 2026/9/23 15:16:06

谷歌 摩托罗拉面试必问
谷歌 摩托罗拉面试必问

3个坑搞定谷歌摩托罗拉工具链最佳实践 刚接手谷歌内部或摩托罗拉遗留项目?别笑,这场景太真实了。 配置环境就卡半天,JDK版本对不上,Maven仓库超时,Gradle依赖冲突报错刷屏。… · 2026/9/23 15:16:06

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码