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地址。
現在有了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
,沒辦法執行,這官方說明寫不對啊
經過反覆嘗試,最終確定問題的原因:
說明(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