【问题标题】:Access `sun.security.x509` in JDK 11 without modules?在没有模块的情况下访问 JDK 11 中的“sun.security.x509”?
【发布时间】:2020-07-23 17:50:28
【问题描述】:

(tl,dr 结尾) 我们有一个生成自签名 SSL 证书的小方法,它显然依赖于sun.security.x509。目前我们仍在使用 JDK8 构建它,尽管其余代码库(它只是一个小型的单一库)是使用 JDK11 构建并使用 JVM11 运行的。

不幸的是,在主 JDK 中没有替换,根据(和 CertificateFactory 几乎没有生成证书,这与它的 javadoc 状态相反......):

一种选择是使用 BouncyCastle,但我们真的不需要额外的 4MB,尤其是对于这么小的任务,所以我在考虑如何访问它的同时

据我所见,包和所需的类仍然是包,相关的类仍然存在(请参阅sun.security.x509 on github 但是在构建它时(使用 maven)我收到错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project: Compilation failure: Compilation failure:
[ERROR] OldSelfSignedCertificateGenerator.java:[20,25] package sun.security.x509 does not exist
[ERROR] OldSelfSignedCertificateGenerator.java:[71,45] cannot find symbol
[ERROR]   symbol:   class X509CertInfo
[ERROR]   location: class OldSelfSignedCertificateGenerator

我搜索了一下并添加:

<arg>--add-exports</arg><arg>java.base/sun.security.x509=ALL-UNNAMED</arg>

maven-compiler-plugin 并且它有点工作 - 我只得到WARNING 而不是sun.security.x509 包:

[WARNING] OldSelfSignedCertificateGenerator.java:[20,25] sun.security.x509.AlgorithmId is internal proprietary API and may be removed in a future release

但是!现在看来我进入了(不情愿地!)模块系统,它抱怨访问其他基本 Java 类(以及我们的另一个依赖项):

[ERROR] CertificateUtil.java:[35,17] package java.util.logging is not visible
  (package java.util.logging is declared in module java.logging, but module java.base does not read it)

我尝试以相同的方式将java.logging 模块添加到导出中,但没有取得多大成功。看来我还必须将此库及其对模块系统的依赖项都转换为模块系统,这并不是真正需要的。

这个问题和How to generate a self-signed certificate using only JDK supported classes?有点关系


tl,博士; 有没有办法在没有模块系统的JDK 11下使用sun.security.x509包编译库?一些简单的开关?

【问题讨论】:

    标签: java maven ssl java-11


    【解决方案1】:

    事实证明,这可能与由较新的 JDK(9+)版本生成的构建在 JDK8 下无法执行的事实有关:

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>9</source>
            <target>9</target>
            <release combine.self="override"></release>
            <compilerArgs>
                <arg>--add-exports</arg><arg>java.base/sun.security.x509=ALL-UNNAMED</arg>
            </compilerArgs>
        </configuration>
    </plugin>
    

    【讨论】:

    • 如何在 gradle 中应用?
    • 不知道,我倾向于完全避免使用 gradle...
    • 你可能还想包含这些包&lt;arg&gt;--add-exports&lt;/arg&gt;&lt;arg&gt;java.base/sun.security.provider=ALL-UNNAMED&lt;/arg&gt;&lt;arg&gt;--add-exports&lt;/arg&gt;&lt;arg&gt;java.base/sun.security.pkcs=ALL-UNNAMED&lt;/arg&gt;&lt;arg&gt;--add-exports&lt;/arg&gt;&lt;arg&gt;java.base/sun.security.util=ALL-UNNAMED&lt;/arg&gt;
    • @dimirsen 对于 gradle 它是:compileJava { options.compilerArgs &lt;&lt; '--add-exports=java.base/sun.security.x509=ALL-UNNAMED' }
    【解决方案2】:

    要在 gradle 中包含 sun.security.[somePackage] 类,您可以添加:

    tasks.withType(AbstractCompile) {
        options.compilerArgs += ["--add-exports", "java.base/sun.security.util=ALL-UNNAMED"]
        options.compilerArgs += ["--add-exports", "java.base/sun.security.pkcs=ALL-UNNAMED"]
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多