gpt4 book ai didi

java.lang.IllegalAccessError : cannot access class because module does not export to unnamed module

转载 作者:行者123 更新时间:2023-12-04 11:21:27 25 4
gpt4 key购买 nike

我目前正在尝试从 jdk-9.0.1 中成功提取 java.base.java.util.jar 包,从中构建一个 .jar 并将该 jar 作为外部库导入到另一个项目中,以便我可以修改其中包含的类的某些方法的行为。

我似乎成功地提取了包,因为我能够消除项目中所有可能的预编译错误并构建 .jar 工件。
我也可以在我的其他项目中将此 .jar 作为外部库导入。

编辑:需要的 java.util.jar 外部的每个私有(private)类(即:SharedSecrets)也被提取并放入 .jar

但是,当我尝试运行它时(通过替换 import java.util.jar.*; 以使用我自己的版本)
我收到此错误:java.lang.IllegalAccessError: class SharedSecrets (in unnamed module @0x2b546384) cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @0x2b546384
我试过添加这个:--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED并添加:--add-exports=java.base/jdk.internal.misc.Unsafe=ALL-UNNAMED对于由提取的 java.util.jar 包组成的项目和我想将其作为外部库导入的项目的编译选项,都没有工作 -> 错误仍然存​​在。

所有其他 --add-exports编译选项中的这些在两个项目中都可以正常工作。

我究竟做错了什么?我必须改变什么才能让它工作?

N.B.:如果有什么不清楚的,请随时提问!

编辑:我尝试使用自己的“java.util.jar”而不是官方的代码(注意目前两者是相同的,唯一的区别是一个保留在 jdk 中,而另一个只是“最小的”可行的产品')

这是不是重复的 this正如我(并且我已经指出)尝试了 --add-exports在另一个问题中建议作为答案。

错误发生在调用 JarFile 构造函数的 4. 行中,该行不会调用 jdk 中的那个,而是我导入的自制库中的那个。

public boolean verifyJar(String jarName)
throws Exception {
boolean anySigned = false; // if there exists entry inside jar signed

Map<String, String> digestMap = new HashMap<>();
Map<String, PKCS7> sigMap = new HashMap<>();
try (JarFile jf = new JarFile(jarName, true)) { // error
Vector<JarEntry> entriesVec = new Vector<>();
byte[] buffer = new byte[8192];

Enumeration<JarEntry> entries = jf.entries();
while (entries.hasMoreElements()) {
JarEntry je = entries.nextElement();
entriesVec.addElement(je);
try (InputStream is = jf.getInputStream(je)) {
String name = je.getName();
if (MySignatureFileVerifier.isSigningRelated(name)
&& MySignatureFileVerifier.isBlockOrSF(name)) {
String alias = name.substring(name.lastIndexOf('/') + 1,
name.lastIndexOf('.'));
try {
if (name.endsWith(".SF")) {
Manifest sf = new Manifest(is);
for (Object obj : sf.getMainAttributes().keySet()) {
String key = obj.toString();
if (key.endsWith("-Digest-Manifest")) {
digestMap.put(alias,
key.substring(0, key.length() - 16));
break;
}
}

} else {
sigMap.put(alias, new PKCS7(is));
}
} catch (IOException ioe) {
throw ioe;
}
} else {
while (is.read(buffer, 0, buffer.length) != -1) {
// we just read. this will throw a SecurityException
// if a signature/digest check fails.
}
}
}
}

Manifest man = jf.getManifest();
boolean hasSignature = false;

if (man != null) {
Enumeration<JarEntry> e = entriesVec.elements();
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
String name = je.getName();

hasSignature = hasSignature
|| MySignatureFileVerifier.isBlockOrSF(name);

CodeSigner[] signers = getCodeSigners(je, sigMap.get("SIGNER"));
boolean isSigned = (signers != null);
anySigned |= isSigned;
}
}
if (man == null) {
System.out.println();
}

// Even if the verbose option is not specified, all out strings
// must be generated so seeWeak can be updated.
if (!digestMap.isEmpty()
|| !sigMap.isEmpty()) {
for (String s : digestMap.keySet()) {
PKCS7 p7 = sigMap.get(s);
if (p7 != null) {
String history;
try {
SignerInfo si = p7.getSignerInfos()[0];
X509Certificate signer = si.getCertificate(p7);
String digestAlg = digestMap.get(s);
String sigAlg = AlgorithmId.makeSigAlg(
si.getDigestAlgorithmId().getName(),
si.getDigestEncryptionAlgorithmId().getName());
PublicKey key = signer.getPublicKey();
PKCS7 tsToken = si.getTsToken();
if (tsToken != null) {
SignerInfo tsSi = tsToken.getSignerInfos()[0];
X509Certificate tsSigner = tsSi.getCertificate(tsToken);
byte[] encTsTokenInfo = tsToken.getContentInfo().getData();
TimestampToken tsTokenInfo = new TimestampToken(encTsTokenInfo);
PublicKey tsKey = tsSigner.getPublicKey();
String tsDigestAlg = tsTokenInfo.getHashAlgorithm().getName();
String tsSigAlg = AlgorithmId.makeSigAlg(
tsSi.getDigestAlgorithmId().getName(),
tsSi.getDigestEncryptionAlgorithmId().getName());
}
} catch (Exception e) {
throw e;
}
}
}
}
System.out.println();
if (!anySigned) {
if (hasSignature) {
System.out.println("jar.treated.unsigned");
} else {
System.out.println("jar.is.unsigned");
return false;
}
} else {
System.out.println("jar.verified.");
return true;

}
return false;
} catch (Exception e) {
throw e;
}
}

最佳答案

正如 Nicolai's 所指出的回复 this问题 --add-exports java.base/jdk.internal.misc=ALL-UNNAMED编译时必须做(javac) 运行(java)代码时。

关于java.lang.IllegalAccessError : cannot access class because module does not export to unnamed module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53633788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com