解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题

2019-05-25 20:35:10 浏览数 (1)

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433441

thrifty是什么

thrifty,对,没有拼写错,就是thrifty,是Microsoft的一个开源项目(https://github.com/Microsoft/thrifty),你可以简单理解为它是一个android版本的thrift框架,是facebook贡献给apache基金会的thrift框架在android平台的实现,与thrift完全兼容。

为什么Microsoft会重复制造轮子,开发一个android版本的thrift呢?因为原版的thrift实现,对于android来说,方法太多,太复杂了,简而言之,就是太重了,并不适合android(android平台对应用的方法数量是有限制的,项目中方法太多,生成APK时都会报错)。所以Microsoft专门为android平台开发轻量版本的thrifty。我还没有尝试,但根据它的依赖库我推测轻量版本的thrifty并没有依赖android平台的独有的API,所以应该也是可以在PC平台的JVM中运行的。

因为项目需要,要求把原本基于PC开发的基于RPC的项目移植到android,我就遇到了thrift/swift在android平台无法运行的问题。经过多方面评估,最后找到了Microsoft/thrifty这个开源项目,正好可以解决我的问题,所以需要基于thrifty重新实现原来的RPC项目。

thrifty-compiler

根据thrifty项目首页的说明(README.md),首先要调用thrifty-compiler编译已有的IDL文件生成 java 代码(Generating Code一节),

thrifty-compiler.jar在哪里?

thrifty-compiler.jar在哪儿?可以直接从maven中央仓库下载,如下是1.0.0版本的thrifty-compiler.jar地址。

http://central.maven.org/maven2/com/microsoft/thrifty/thrifty-compiler/1.0.0/thrifty-compiler-1.0.0.jar

现在有了thrifty-compiler.jar,根据说明尝试运行它,问题又来了:

代码语言:javascript复制
J:facelog>java -jar thrifty-compiler-1.0.0.jar
thrifty-compiler-1.0.0.jar中没有主清单属性

好么,这thrifty-compiler-1.0.0.jar敢情只是一个普通的jar,没有指定Main-Class,没办法运行,这官方说明写不对啊

经过反复尝试,最终确定问题的原因:

说明(README.md)与项目的实际情况的确有出入,thrifty官方发布到maven中央仓库的thrifty-compiler.jar并不是可执行的jar(没有指定Main-Class,也没有包含依赖的库,不是Fat-jar),而通过查看thrift的gradle脚本,可以看到脚本中已经提供了shadowJar这个task用于生成thrifty-compiler的Faj-Jar,所以要想得到可执行的thrifty-compiler.jar,最直接的办法就是下载thrifty的源码,执行shadowJar任务编译出可命令行执行的thrifty-compiler.jar。

编译thrifty

thrifty是用kotlin语言写的,项目构建工具是用gradle,所以要编译thrifty,需要安装kotlin compiler和gradle.

安装kotlin

kotlin编译器可以去kotlin的官网(http://kotlinlang.org/)下载,当前最新版本为1.3.11下载地址:

https://github.com/JetBrains/kotlin/releases/download/v1.3.11/kotlin-compiler-1.3.11.zip

将zip包解压到本地文件夹,然后设置KOTLIN_HOME环境变量指定该文件夹,然后还要将bin子文件添加到PATH搜索路径(Windows平台)。

代码语言:javascript复制
SET KOTLIN_HOME=D:jkotlinc
SET PATH=%KOTLIN_HOME%bin;%PATH%

执行kotlin -version能正常显示版本信息即安装成功

代码语言:javascript复制
>kotlin -version
Kotlin version 1.3.11-release-272 (JRE 1.8.0_111-b14)

安装gradle

gradle下载地址:https://gradle.org/releases/

比如我使用的是4.5版本,下载地址:https://services.gradle.org/distributions/gradle-4.5-bin.zip

(https://services.gradle.org/distributions/ 可以显示所有发布版本的版本压缩包文件名列表)

跟安装kotlin差不多,解压后,要设置环境变量GRADLE_HOME,并将bin子文件夹设置到PATH环境变量

代码语言:javascript复制
SET GRADLE_HOME=D:jkotlinc
SET PATH=%GRADLE_HOME%bin;%PATH%

执行gradle -v,能正常显示版本信息,即为安装成功

gradle -v

代码语言:javascript复制
------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------

Build time:   2018-01-24 17:04:52 UTC
Revision:     77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_111 (Oracle Corporation 25.111-b14)
OS:           Windows 7 6.1 amd64

编译thrifty-compiler

代码语言:javascript复制
# 克隆thrifty源码
git clone https://github.com/Microsoft/thrifty.git 
cd thrifty
# 切换到1.0.0版本
git checkout 1.0.0
# 执行shadowJar任务编译项目生成fat-jar 
gradlew shadowJar

gradlew shadowJar 命令输出:

代码语言:javascript复制
J:thrifty>gradlew shadowJar
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (89, 56): No cast needed
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (93, 56): No cast needed
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (97, 52): No cast needed
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (104, 42): No cast needed
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (111, 42): No cast needed
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (118, 42): No cast needed
w: J:thriftythrifty-schemasrcmainkotlincommicrosoftthriftyschemaSchemaFunctionalEquality.kt: (125, 42): No cast needed

Deprecated Gradle features were used in this build, making it incompatible with
Gradle 5.0.
See https://docs.gradle.org/4.7/userguide/command_line_interface.html#sec:comman
d_line_warnings

BUILD SUCCESSFUL in 22s
24 actionable tasks: 23 executed, 1 up-to-date

OK,编译结束,你可以在$thriftythrifty-compilerbuildlibs文件夹下看到除了thrifty-compiler-1.0.0.jar外还生成了一个22MB大小的thrifty-compiler-1.0.0-all.jar文件,这个就是包含了thrifty-compiler所有依赖库的可运行fat-jar。

编译IDL(.thrift)

重新执行thrifty-compiler-1.0.0-all.jar

代码语言:javascript复制
java -jar $thriftythrifty-compilerbuildlibsthrifty-compiler-1.0.0-all.jar --out=path/to/output my.thrift

就可以正常生成java class代码了。

Java 8 required

如果在执行项目编译时报错,说明你的环境变量中设置的JAVA_HOME指向的Java 7,而kotlin编译器要求Java 8,所以你需要修改JAVA_HOME环境变量,将JAVA_HOME指向Java 8:

代码语言:javascript复制
* What went wrong:
A problem occurred evaluating project ':thrifty-compiler'.
> java.lang.UnsupportedClassVersionError: org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper : Unsupported major.minor version 52.0

0 人点赞