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

Microsoft/thrifty:解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题thrifty是什么thrifty,对,没有拼写错,就是thrifty,是Microsoft的一个开源项目(https://github.com/Microsoft/thrifty),你可以简单理解为它是一个andro

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,根据说明尝试运行它,问题又来了:

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平台)。

SET KOTLIN_HOME=D:\j\kotlinc
SET PATH=%KOTLIN_HOME%\bin;%PATH%

在这里插入图片描述
执行kotlin -version能正常显示版本信息即安装成功

>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环境变量

SET GRADLE_HOME=D:\j\kotlinc
SET PATH=%GRADLE_HOME%\bin;%PATH%

在这里插入图片描述
在这里插入图片描述
执行gradle -v,能正常显示版本信息,即为安装成功
>gradle -v

------------------------------------------------------------
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

# 克隆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 命令输出:

J:\thrifty>gradlew shadowJar
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.kt: (89, 56): No cast needed
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.kt: (93, 56): No cast needed
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.kt: (97, 52): No cast needed
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.kt: (104, 42): No cast needed
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.kt: (111, 42): No cast needed
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.kt: (118, 42): No cast needed
w: J:\thrifty\thrifty-schema\src\main\kotlin\com\microsoft\thrifty\schema\SchemaFunctionalEquality.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,编译结束,你可以在$thrifty\thrifty-compiler\build\libs文件夹下看到除了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

java -jar $thrifty\thrifty-compiler\build\libs\thrifty-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:

* 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

今天的文章Microsoft/thrifty:解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/64115.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注