java 在JDK 11中访问`sun.security.x509`而不使用模块?

iq3niunx  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(578)

(tl我们有一个生成自签名SSL证书的小方法,它显然依赖于sun.security.x509。因此,目前我们仍然使用JDK 8构建它,即使代码库的其余部分(它只是一个小的单一库)是使用JDK 11构建并使用JVM 11运行的。
不幸的是,在主JDK中没有替换,根据(CertificateFactory几乎没有生成证书,与javadoc的状态相反...):

一个选择是使用BouncyCastle,但这是额外的4 MB,我们真的不需要,特别是对于这样的小任务,所以我正在考虑如何访问它,而
从我所看到的,包和所需的类仍然是包,相关的类仍然存在(参见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,dr;有没有一种方法可以在JDK 11下使用sun.security.x509包编译库,而不需要模块系统?简单的交换?

iezvtpos

iezvtpos1#

事实证明,这可能与较新的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>
zvokhttg

zvokhttg2#

要在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"]
}
vd2z7a6w

vd2z7a6w3#

我用sun.security.x509代码进行了junit 5测试。测试失败,出现了这样的错误,尽管我在上面配置了一个“maven-compiler-plugin”,并使用了额外的编译参数。我可以通过添加额外的配置参数到'maven-surefire-plugin'来修复test(on graalvm jdk 17),如下所示。

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <argLine>--add-opens java.base/sun.security.x509=ALL-UNNAMED</argLine>
        </configuration>
</plugin>

相关问题