前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题

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

作者头像
10km
发布2019-05-25 20:35:10
1.3K0
发布2019-05-25 20:35:10
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 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,根据说明尝试运行它,问题又来了:

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • thrifty是什么
  • thrifty-compiler
    • thrifty-compiler.jar在哪里?
    • 编译thrifty
      • 安装kotlin
        • 安装gradle
          • 编译thrifty-compiler
          • 编译IDL(.thrift)
          • Java 8 required
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档