当前位置: 首页 > 工具软件 > OpenJFX > 使用案例 >

OpenJFX编译填坑之路

卫甫
2023-12-01

用于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

转载于:https://juejin.im/post/5bc5d6f36fb9a05cf715c384

 类似资料: