17.10 openjdk和oracle jdk 8和9的trustAnchors参数必须非空。

我刚在一个全新的虚拟机上安装了17.10版本。尝试设置开发环境时,当我运行gradle./gradlew时,出现以下错误:
* What went wrong:
Error resolving plugin [id: 'com.github.johnrengelman.shadow', version: '2.0.0']
> Could not GET 'https://plugins.gradle.org/api/gradle/4.0/plugin/use/com.github.johnrengelman.shadow/2.0.0'.
   > java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

不论是gradle版本、java版本(openjdk和oracle 8和9都有这个问题),还是shadowjar版本,都无法解决这个问题。这让我得出结论,这个问题与Ubuntu相关,而不是gradle/openjdk/oracle相关。
我尝试更新CA证书,使用了"sudo update-ca-certificates -f"和"sudo apt install ca-certificates-java --reinstall"命令,但都没有解决问题。甚至我还试图使用常用的重启技术,也没有产生任何效果。
问题出在哪里,我该如何解决?

遇到了同样的问题,而且卸载/重新安装 openjdk-8-jdk 对我来说没有起作用。你有什么办法让它工作吗?在安装 openjdk-8-jdkopenjdk-9-jdk 之前,我运行了 autoremove 命令,但这可能是你所说的唯一与我的操作不同的地方。 - Andy
一样。我已经尝试了所有8的排列组合:jre、jdk和oracle版本。 - 0atman
5个回答

我用apt-get重新安装了所有东西,但问题没有解决。
我找到的解决办法是:去Oracle下载jdk-8的tar.gz版本,然后将其中的cacerts文件复制到/etc/ssl/certs/java/cacerts目录中。

2这个问题有点奇怪。感谢你分享你的解决方案。最后我从我的Ubuntu 16.04上的OpenJDK 8安装中复制了cacerts文件,才使得它正常工作。奇怪的是,安装在Ubuntu 17.10上的OpenJDK 9的cacerts似乎并不是空的(比旧版本的大),只是无法正常工作。 - JeroenHoek
3不要简单地复制粘贴旧的证书,你还可以清除java-commons以及jdk,然后重新安装一个jdk。这样,证书将会被正确地重新生成。 - k0pernikus
1这是我在Ubuntu 18.04 / OpenJDK 11上唯一有效的解决方案。 - zergussino
1重新安装对我来说也没有用,无论是在Ubuntu 18.04还是OpenJDK 11上。所以我下载了jdk-10.0.1_linux-x64_bin.tar.gz。你可以在jdk-10.0.1/lib/security/cacerts找到cacerts文件。 - iGEL
即使从Windows JDK安装中复制,清理和重新安装也无效(使用openjdk 8、9或10),我正在使用WSL。 - FrankMonza
在我的情况下,我使用的是在我的PATH中指向的OpenJDK版本。所以我不得不像这样复制Oracle cacerts:cp jdk1.8.0_172/jre/lib/security/cacerts jdk8u/build/linux-x86_64-normal-server-release/jdk/lib/security/cacerts - Dave Griffiths
这对我很有用,谢谢你。 - DribblzAroundU82
在我的情况下,我从某个奇怪的地方下载了一个tar文件,试图避免使用Oracle官网。使用Oracle官网的版本起作用了。 - Sridhar Sarnobat

我在尝试在我的全新17.10安装上设置Scala构建工具(sbt)时也遇到了这个问题。
我的解决方案是彻底清除以下内容:My solution
sudo apt purge openjdk-9-jdk openjdk-8-jdk java-common

(仅仅清理并重新安装 JDK 是不够的,之后我还是有一个 "java" 命令。只有通过清理 "java-common" 才能使其消失,然后重新安装才有效。我猜测这与 "ca-certificates-java*" 包有关,它会被 "java-common" 清理。)
(然后,我再次安装了 Java(我选择了只安装 openjdk-9):)
sudo apt install openjdk-9-jdk

这触发了:正在运行钩子 /etc/ca-certificates/update.d...并添加了许多证书文件。现在我的 sbt 构建成功了。
$ sbt
Getting org.scala-sbt sbt 1.1.0  (this may take some time)...
downloading https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.1.0/sbt-1.1.0.jar ...
    [SUCCESSFUL ] org.scala-sbt#sbt;1.1.0!sbt.jar (657ms)
downloading https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.1.0/main_2.12-1.1.0.jar
...  

谢谢你的帮助,这解决了我的问题。根据keytool的提示,我发现我的cacerts文件是空的,按照你建议的方法(在我的情况下是重新安装jdk8并清除旧版本),问题得到了修复。 - Brian Smith
这对我在Linux Mint 19上(已安装openjdk-11)起作用,而我想使用openjdk-8。 - James

我又从头重新安装了所有东西,这个问题就消失了。我唯一做的不同之处是在安装openjdk-9-jdk之前先安装了openjdk-8-jdk
它正常工作了。有什么奇怪的依赖问题吗?

这对我也起作用,但是我不得不重新启动系统。基本上,我先安装了openjdk-9-jdk,然后是8。我卸载了两个版本,然后重新安装了8 - 然后 - 9。我还一直运行sudo update-ca-certificates -f。那天早上并不是很忙,所以我开始下载Oracle JDK。在下载完成之前,我发现openjdk可以工作,并且gradle成功拉取了。 - foxx1337
2我还必须清除java-common。我猜问题是由于错误安装的ca-certificates-java引起的;这个也会随着java commons一起被移除,并在重新安装时创建一堆pem文件。安装openjdk-8并不是必要的。 - k0pernikus

我从旧版本的备份中复制了一个/etc/ssl/certs/java/cacerts文件。如果你也有类似的文件,这可能是最简单的选择。只需确保在其他应用程序出现问题时备份原始的cacerts文件。

Oracle将cacerts文件的格式更改为PKCS12(从JKS)。默认包含在Ubuntu中的JDK已经使用PKCS12算法;但是,您可能正在使用无法读取它的较旧的JDK。
我使用keytool将我的密钥库文件转换为JKS。这就是为什么将较旧的文件复制一份作为解决方法适用于其他人,以及为什么您接受的答案也有效的原因。