OpenJFX編譯填坑之路

_Git發表於2018-10-22

用於jdk8中OpenJFX的編譯

Gradle

設定代理

windows/linux下.gradle/下init.gradle gradle.properties init.gradle 這個檔案就是用來配倉庫的,一個不行換一個

allprojects{
    repositories{
        maven{
            url 'http://maven.aliyun.com/nexus/content/groups/public/'
            //credentials{
            //    username 'anonymous'
            //    password 'devcloud'
            //}
        }
        //mavenCentral()
        //maven { url "http://oss.sonatype.org/content/repositories/snapshots" }
        //maven { url "https://jitpack.io" }
    }
}

複製程式碼

gradle.properties 這個檔案就是加代理的

systemProp.http.proxyHost=proxy.neusoft.com
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=
systemProp.http.proxyPassword=
systemProp.http.nonProxyHosts=localhost

systemProp.https.proxyHost=proxy.neusoft.com
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=
systemProp.https.proxyPassword=
systemProp.https.nonProxyHosts=localhost
複製程式碼

jcenter庫

jcenter()有時候不好使,需要換成maven { url "jcenter.bintray.com"}或者maven { url "maven.aliyun.com/nexus/conte…"}

報錯沒有認證

cause: unable to find valid certification path to requested target

這個問題應該是沒有證照,報錯的url開啟,獲取證照,匯入idea的jre以及系統jdk的jre中

keytool -import -alias abc -keystore cacerts -file D://abc.cer
複製程式碼
  1. 匯入證照方法參考
  2. 參考二

編譯的依賴問題

  1. idea啟動必須有jre,windows版本自帶jre,但是linux沒有jre,所以需要安裝的jdk中自帶jre,如果使用openjdk沒有jre,需要手動自己安裝jre方可啟動
  2. 上外網需要代理的情況下,想啟用idea需要在system settings設定代理,並且在jre中匯入證照
  3. gradle專案編譯需要jdk,需要檢視當前使用的哪個jdk,idea中可以對每個專案單獨指定jdk,但是終端中用gradle命令的話,需要檢視系統JDK是哪個

openjfx

github上openjfx11的專案地址

openjfx用gradle進行編譯

Windows平臺編譯遇到的問題

報錯

原因:使用openjdk中缺少ant-javafx.jar和javafx-mx.jar這兩個jar,oracle jdk中有,需要從oracle中拷貝出來

link報錯

因為cygwin中有一個link.exe,而vs2017中也有一個link.exe,需要用vs2017的link, 解決方案:

  1. cmd中進行編譯
  2. 編譯需要link.exe的地方使用全路徑
  3. 環境變數中將vs的環境變數前置於cygwin64中

cvtres.exe找不到

這個是vs2017中的可執行程式,需要將vs的環境變數加入path中 vs中環境變數是bin\HostX64\x64/bin\HostX86\x86這樣的路徑

error LNK2038: mismatch detected for 'RuntimeLibrary'

這個錯是因為link的時候檢查不一致導致的,編譯出來的obj檔案中加入了靜態庫libcpmt.lib,而生成dll需要加入一個動態庫msvcprt.lib參考連結

分析檢查發現加在編譯obj的時候加入了選項-D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB而加入這個選項是因為Makefile中VS_VER等於100導致的,即visual studio版本是100,但是實際電腦裝的是vs2017,應該是VS_VER=150,分析發現在build/windows_tools.properties中的VS_VER=100

再分析windows_tools.properties生成的命令,發現執行一個bat指令碼不存在,最後只能設定為100

通過修改生成指令碼使得VS_VER=150

CMake Error: Could not create named generator Visual Studio 15 2017 win64

這個原因是cmake導致的,和前面類似,cygwin中有一個cmake,但是這個cmake不能用於windows上編譯openjfx,需要改用windows上的cmake,且cmake的版本不能太低,我選用的的cmake3.12.3,cmake的bin目錄加入path環境變數,且需要在cygwin的bin目錄之前

這樣修改發現還是有錯誤

多次嘗試發現是在呼叫build.gradle命令

commandLine("perl", "$projectDir/src/main/native/Tools/Scripts/build-webkit",
                    "--java", "--icu-unicode", targetCpuBitDepthSwitch,
                    "--cmakeargs=${cmakeArgs}")
複製程式碼

出錯 整句話呼叫的是build-webkit這個命令,開啟這個檔案看到第一句話

#!/usr/bin/env perl 
複製程式碼

說明這個是需要perl支援,是一個bash指令碼,所以需要用的是cygwin中的perl,再看環境變數,發現有人在c盤中加入了per64\bin這樣的環境變數,因此呼叫的並非cygwin中的perl,所以編譯不成功

刪除了per64\bin的環境變數編譯成功

做單元測試fxpackager:test的時候有6個fail

  1. 對比oracle的測試結果,發現沒有fail
  2. 分析發現在oracle jdk中有jre/bin/下有vcruntime140.dll msvcp140.dll這兩個dll檔案,這兩個檔案在執行測試用例時會拷貝到build目錄下,因我司JDK中並無這兩個dll,所以編譯不通過
  3. 考慮是編譯windows版本Jdk還是windows版本的openjfx導致沒有生成這個兩個dll

相關文章