Apache Gora 0.9 常用命令与工具详解

详解 Apache Gora 0.9 命令行工具链:gora-compiler-cli 编译器实测详解(用法、静默 exit(1) 失败链与源码定位、classpath 准备、生成代码核验)、mvn 命令速查、gora-maven-plugin 与周边模块参考,含实测 FAQ

Apache GoraApacheGoraNoSQLORMJava运维2026/10/15

Apache Gora 0.9 常用命令与工具详解

Gora 的核心 CLI 是 GoraCompilerCLI(Avro schema → 持久化类编译器),也是 0.9 唯一随发行包提供的命令行工具。本文全部输出在 Ubuntu 22.04 容器(Temurin 17 + Maven 3.9.16,gora-compiler-cli/gora-core 0.9)真实采集;标注"参考"的内容来自官方文档/源码。

一、工具清单(0.9 实际可用)

工具坐标形态状态
GoraCompilerCLIorg.apache.gora:gora-compiler-cli:0.9java -cp ... org.apache.gora.compiler.cli.GoraCompilerCLI实测
gora-compilerorg.apache.gora:gora-compiler:0.9编译内核(API/库)传递引入
gora-maven-pluginorg.apache.gora:gora-maven-pluginMaven 插件未随 0.9 核验,参考
gora-goraciorg.apache.gora:gora-goraci分布式排序示例/基准工具参考
gora-tutorialorg.apache.gora:gora-tutorial官方教程工程(conf 模板来源)参考

二、GoraCompilerCLI 用法(源码 printHelp 实拍)

Usage: GoraCompiler <schema file> <output dir> [-license <id>]
参数说明
<schema file>Avro JSON schema 文件;也可以是目录(编译目录下全部 schema)
<output dir>生成代码输出目录,必须预先存在(否则静默退出 1,见第三章)
-license <id>可选,生成文件头许可标识(如 ASLv2)

主类实测核实:jar tf gora-compiler-cli-0.9.jar 中确认 org/apache/gora/compiler/cli/GoraCompilerCLI.class。

三、首次失败实录:静默 exit(1)(最重要的排障章)

未预建输出目录、classpath 无 SLF4J 绑定时直接编译,实测无任何日志、直接退出:

=== 正式编译 person.json -> src-generated/java ===
exit=1

定位过程(实测下载 gora-compiler-cli-0.9-sources.jar 阅读源码),两个因素叠加:

  1. 输出目录必须预先存在——CLI 源码逻辑:
File outputDir = new File(args[args.length-1]);
if(!outputDir.isDirectory()){ ... System.exit(1); }
  1. SLF4J 无可用绑定时错误日志被吞——传递依赖 slf4j-log4j12 1.6.6 无 log4j 配置不出声,错误"发生了但看不见"。

解法(实测有效):先 mkdir -p 输出目录,并把 slf4j-simple-1.7.36.jar 加进 -cp。

四、classpath 准备与成功运行实测

mvn dependency:build-classpath -Dmdep.outputFile=/tmp/gora-cp.txt
mkdir -p src-generated/java
java -cp "/tmp/slf4j-simple-1.7.36.jar:$CP" org.apache.gora.compiler.cli.GoraCompilerCLI \
     src/main/resources/person.json src-generated/java

真实输出(逐行照抄,实测):

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/tmp/slf4j-simple-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/root/.m2/repository/org/slf4j/slf4j-log4j12/1.6.6/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[main] INFO org.apache.gora.compiler.GoraCompiler - Compiling: /work/gora-demo/src/main/resources/person.json
[main] INFO org.apache.gora.compiler.GoraCompiler - Compiled into: /work/gora-demo/src-generated/java
[main] INFO org.apache.gora.compiler.cli.GoraCompilerCLI - Compiler executed SUCCESSFULL.
exit=0
=== 生成文件清单 ===
src-generated/java/demo/gora/Person.java
  • 前 5 行 SLF4J 提示是预期现象(手动 slf4j-simple 与传递 slf4j-log4j12 并存),实际绑定 SimpleLoggerFactory,不影响结果;
  • 三行 INFO 给出输入路径、输出目录与成功结论,配合 exit=0 双重确认。

五、schema 与生成代码核验

schema person.json(fields: id/long 主键、name/string、age/int,namespace demo.gora),生成类关键签名(对生成文件 grep 实拍):

21:public class Person extends org.apache.gora.persistency.impl.PersistentBase implements org.apache.avro.specific.SpecificRecord, org.apache.gora.persistency.Persistent {
97:  public void put(int field$, java.lang.Object value) {
117:  public void setId(java.lang.Long value) {
141:  public void setName(java.lang.CharSequence value) {
165:  public void setAge(java.lang.Integer value) {

类型映射实测结论:schema long → java.lang.Long、string → java.lang.CharSequence、int → java.lang.Integer。类同时实现 Avro SpecificRecord 与 Gora Persistent 契约(PersistentBase 基类 + 内嵌 SCHEMA$)。

后续工序:把 src-generated/java 加入 Maven 的 build-helper-maven-plugin additional-source(参考用法)或直接拷入 src/main/java,随工程一起编译。

六、Maven 命令速查

命令作用
mvn dependency:build-classpath -Dmdep.outputFile=/tmp/gora-cp.txt导出编译器 classpath(实测命令)
mvn clean package编译工程(含生成的持久化类)
mvn dependency:tree -Dincludes=org.apache.gora查看 Gora 模块依赖树
jar tf ~/.m2/repository/org/apache/gora/gora-compiler-cli/0.9/gora-compiler-cli-0.9.jar | grep GoraCompilerCLI核实主类(实测命令)

七、gora-maven-plugin 与周边(参考)

  • gora-maven-plugin:把 schema 编译接入 Maven 生命周期的插件模块(模块清单见介绍篇第四章),goal 详情以官方插件站点为准(0.9 周边发行质量参差,本次未实测);
  • gora-goraci:官方"分布式有序表"示例工程,可作为接入 HBaseStore 的参考实现;
  • gora-tutorial:官方教程工程,其 conf/gora.properties 是配置模板的权威来源(配置篇第二章)。

八、FAQ(实测排障)

Q1:编译器 exit=1 且无任何输出? 两大原因叠加:输出目录不存在 + SLF4J 无绑定(第三章)。mkdir -p + classpath 加 slf4j-simple 即可。

Q2:schema 文件传目录行不行? 行,<schema file> 可以是目录(编译目录下全部 schema)。

Q3:生成类字段类型和预期不同? 以实测映射为准:long→Long、string→CharSequence、int→Integer(第五章);业务代码按 CharSequence 处理 name 类字段。

Q4:-license 必须传吗? 可选;不传则生成文件无许可头,公司合规要求时加 -license ASLv2。

Q5:多个 schema 怎么一次编译? 指向目录,或多次调用逐个文件;输出目录共用。

Q6:生成的类能直接用 Jackson 序列化吗? 可以但无意义——Gora 实体走 Avro 序列化链路(SCHEMA$ 内嵌),持久化交给 DataStore。

Q7:Java 17 编译生成的类有问题吗? 实测生成源码可在 17 下编译;Gora 0.9 运行时对 JDK 17 无官方认证,生产建议 JDK 8/11。

Q8:能跳过 schema 直接写 @PersistenceCapable 式注解吗? 不能,Gora 0.9 实体必须由 Avro schema 编译生成(区别于 JDO 注解模式)。

Q9:编译器输出目录里会生成什么? 每个 schema 一个 .java(namespace/类名.java,实测 demo/gora/Person.java),无其他文件。

Q10:项目已退役(Attic)还能用这些工具吗? 能,0.9 为终版且构件长期留存 Maven Central;新项目选型需评估维护风险(介绍篇第八章迁移视角)。

参考链接