(tl我们有一个生成自签名SSL证书的小方法,它显然依赖于sun.security.x509
。因此,目前我们仍然使用JDK 8构建它,即使代码库的其余部分(它只是一个小的单一库)是使用JDK 11构建并使用JVM 11运行的。
不幸的是,在主JDK中没有替换,根据(CertificateFactory
几乎没有生成证书,与javadoc的状态相反...):
- https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8165481
- https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058778
一个选择是使用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
包编译库,而不需要模块系统?简单的交换?
3条答案
按热度按时间iezvtpos1#
事实证明,这可能与较新的JDK(9+)版本生成的构建在JDK8下无法执行的事实有关:
zvokhttg2#
要在gradle中包含
sun.security.[somePackage]
类,您可以添加:vd2z7a6w3#
我用sun.security.x509代码进行了junit 5测试。测试失败,出现了这样的错误,尽管我在上面配置了一个“maven-compiler-plugin”,并使用了额外的编译参数。我可以通过添加额外的配置参数到'maven-surefire-plugin'来修复test(on graalvm jdk 17),如下所示。