2020 手把手解决 Java Gradle 项目构建遇到的问题

LittleboyHarry


环境 版本
操作系统 Win10 x64
JDK AdoptOpenJDK_x64 11 (主)、Oracle JDK8_x64
文本编辑器 (IDE) VSCode
Shell PowerShell 7 ( 简称 pwsh )
Gradle 项目的 Wrapper
Socks 服务 localhost:10808

开始

首先,我不为 Java 设置任何代理设置或额外参数。

我以游戏 Minecraft Forge 模组开发的典型 Java Gradle 构建项目为例子,进行演示。请读者提前去官网下载开发包并解压:

在解压后的目录打开 VSCode, 然后在终端内输入 ./gradlew 走起:

此时屏幕输出 Starting Deamon ... 代表 Gradle 服务运行中

出错范例分析

报错,但提示过于简单。使用指令 ./gradlew --stacktrace 再运行一次:

发现这是证书问题


大名鼎鼎的 jcenter 库不可能宕机,导致 Read timed out,信号肯定被干扰了。

开启代理

下面配置 Java 代理,设置环境变量

$env:JAVA_TOOL_OPTIONS="-DsocksProxyHost=localhost -DsocksProxyPort=10808"

我推荐使用临时环境变量的方式,使代理再终端运行期内有效:

修改 pwsh profile 里,以后直接运行 Use-Proxy 即可 ( 在 > pwsh6 开始,可以输入 u-p + 多次 tab 快速补全 )

在 pwsh 中执行 code $profile, 输入并保存:

function Use-Proxy {
	$env:JAVA_TOOL_OPTIONS = "-DsocksProxyHost=localhost > -DsocksProxyPort=10808"
}

重启终端会话,执行 Use-Proxy 后再运行 java:

如图说明代理已配置。

十分注意: 我认为 deamon 守护进程的运作模式可能与代理发生意向不到的作用,所以我推荐你关闭守护进程来进行操作,直到项目能正常构建为止。

解决证书问题

报错特征:

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

首先推荐大家下载两个开源项目:

  1. 点击项目 SSLPoke 下的 release 下载 .jar 文件保存
  2. git clone InstallCert
  3. 推荐把 SSLPoke.jar 放到 InstallCert 同一目录下
  4. 在目录内打开终端

下面举个例子:如何解决访问 baidu.com 证书错误。

  1. 使用 SSLPoke 测试连接到百度 java -jar .\SSLPoke.jar <主机名> 443

  2. 执行 java .\InstallCert.java <主机名> 下载网站证书

    java 11 版本一下必须先编译 .java 后才能运行

    2020-06-11-12-45-56

  3. 小程序将输出所有证书列表,输入数字键自动导入证书。如果有多个网站证书,请重复步骤 3

  4. 成功效果:

    2020-06-11-12-55-12

其他故障排查

关闭 Gradle 后台守护进程

./gradlew --stop

一次性禁止:启动时带上参数 --no-daemon

永久禁止:在 gradle.properties 中写入 org.gradle.daemon=false

大功告成

输入 ./gradlew tasks

2020-06-11-13-01-40

有问题我尽量期末有空后解答大家问题,我也发在 CSDN 上了,欢迎点赞收藏。


LittleboyHarry


目前已知 d29vzk4ow07wi7.cloudfront.net 这个域名的证书 jdk 不包含,需要添加一下