版权声明:本文为博主原创文章,转载请注明源地址。 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平台)。
SET KOTLIN_HOME=D:jkotlinc
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:jkotlinc
SET PATH=%GRADLE_HOME%bin;%PATH%
执行gradle -v
,能正常显示版本信息,即为安装成功
代码语言:javascript复制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
代码语言: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
命令输出:
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
,
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:
* 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