在没有模块的情况下访问 JDK 11 中的“sun.security.x509”?

Woj*_*tek 8 java ssl maven java-11

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

不幸的是,主 JDK 中没有替换,按照(并且CertificateFactory几乎没有生成证书,与 javadoc 声明的相反......):

一种选择是使用 BouncyCastle,但这是我们真正不需要的额外 4MB,特别是对于这么小的任务,所以我正在考虑访问它的方法

从我所看到的,包和所需的类仍然是包,相关的类仍然存在(参见sun.security.x509github但在构建它时(使用 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
Run Code Online (Sandbox Code Playgroud)

我正在搜索并添加:

<arg>--add-exports</arg><arg>java.base/sun.security.x509=ALL-UNNAMED</arg>
Run Code Online (Sandbox Code Playgroud)

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

但!现在看来我进入了(不情愿!)模块系统,它抱怨访问其他基本 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)
Run Code Online (Sandbox Code Playgroud)

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

该问题与如何仅使用 JDK 支持的类生成自签名证书有关?


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

Woj*_*tek 6

它变成了一个警告,即由较新的 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>
Run Code Online (Sandbox Code Playgroud)

  • 并且......它停止与 JDK17 一起工作 (4认同)
  • 不知道,我倾向于完全避免使用 gradle... (2认同)
  • @dimirsen 对于 gradle 来说是: `compileJava { options.compilerArgs &lt;&lt; '--add-exports=java.base/sun.security.x509=ALL-UNNAMED' }` (2认同)