1. 程式人生 > >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),你可以簡單理解為它是一個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