在lein deps期间,使用OpenJDK 9对Travis CI进行Clojure构建失败

Gav*_*vin 5 clojure leiningen travis-ci clojars

背景

我有一个简单的Clojure 1.9 项目.

它配置了一个最小的.travis.yml.

language: clojure
lein: 2.8.1

jdk:
- openjdk8
- openjdk9
- oraclejdk8
- oraclejdk9
Run Code Online (Sandbox Code Playgroud)

特拉维斯CI

OpenJDK 8,OracleJDK 8和OracleJDK 9的构建成功.但是,OpenJDK 9在lein deps舞台上失败了.

无法从Clojars中检索到五件工件.他们是clojure-complete,clj-httppedestal.service,pedestal.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.
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么它只发生在OpenJDK9版本中?
  2. 这是Travis CI或我的配置的错误吗?
  3. 我该如何解决?

谢谢!

Gav*_*vin 9

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"
Run Code Online (Sandbox Code Playgroud)

其他方案

或者,您也可以使用自定义矩阵进行JDK安装.

OpenJDK 10和11的更新

jdk_install.shTravis 安装的所有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
Run Code Online (Sandbox Code Playgroud)