在Travis CI上使用OpenJDK 9时,Clojure构建失败,在运行"lein deps"期间。

6

背景

我有一个简单的Clojure 1.9 项目

它只配置了一个最小的.travis.yml文件。

language: clojure
lein: 2.8.1

jdk:
- openjdk8
- openjdk9
- oraclejdk8
- oraclejdk9

Travis CI

OpenJDK 8、OracleJDK 8和OracleJDK 9的构建成功了。然而,在lein deps阶段,OpenJDK 9失败了。

从Clojars中无法检索到五个工件。它们是clojure-completeclj-httppedestal.servicepedestal.jettypedestal.service-tools

似乎与证书有关的一些问题。我在下面包含了一些日志。

Could not find artifact clojure-complete:clojure-complete:jar:0.2.4 in central (https://repo1.maven.org/maven2/)
Could not transfer artifact clojure-complete:clojure-complete:jar:0.2.4 from/to clojars (https://repo.clojars.org/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Could not transfer artifact clojure-complete:clojure-complete:pom:0.2.4 from/to clojars (https://repo.clojars.org/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
This could be due to a typo in :dependencies, file system permissions, or network issues.
If you are behind a proxy, try setting the 'http_proxy' environment variable.

问题

  1. 为什么只在OpenJDK9版本上发生了这样的情况?
  2. 是Travis CI的bug还是我的配置有误?
  3. 我该如何修复它?

谢谢!

2个回答

10

Travis CI问题跟踪器[1]和clojurians Slack中讨论了此事。

原因是OpenJDK 9不带有签署Clojars证书的证书。

Christian Stein提到Travis CI将始终提供未修补的JDK安装程序。如果需要,用户将需要在系统CA证书中创建符号链接(原话)。

解决方法

这是更新后的最小Travis CI配置。

它涉及在before_install阶段手动创建系统CA证书的符号链接。

language: clojure
lein: 2.8.1

jdk:
  - openjdk8
  - oraclejdk8
  - oraclejdk9

matrix:
  include:
    - jdk: openjdk9
      before_install:
        - rm "${JAVA_HOME}/lib/security/cacerts"
        - ln -s /etc/ssl/certs/java/cacerts "${JAVA_HOME}/lib/security/cacerts"

其他解决方案

另外,您也可以使用自定义矩阵进行JDK安装。

针对OpenJDK 10和11的更新

由Travis使用jdk_install.sh安装的所有OpenJDK版本不会修补证书。因此,您在OpenJDK 10和11上也会遇到相同的问题。

您可以通过巧妙地放置YAML锚点来减少这些SDK版本的模板代码,如下面的示例所示。

matrix:
  include:
- jdk: openjdk9
  before_install: &fix_certs
    - rm "${JAVA_HOME}/lib/security/cacerts"
    - ln -s /etc/ssl/certs/java/cacerts "${JAVA_HOME}/lib/security/cacerts"
- jdk: openjdk10
  before_install: *fix_certs
- jdk: openjdk11
  before_install: *fix_certs

在我们的讨论之后,Daniel撰写了一份详细的指南,您可以从他的文章中了解更多信息。https://www.deps.co/guides/travis-ci-latest-java/ - Gavin

0

谢谢Peter!Daniel和我在Clojurians Slack上进行了一些讨论。他也遇到了这个问题。现在已经找到了一个解决方法。 - Gavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接