java.lang. IllegalList错误:无法访问类,因为模块未导出到未命名的模块

4nkexdtk  于 2023-11-15  发布在  Java
关注(0)|答案(3)|浏览(187)

我目前正在尝试成功地从jdk-9.0.1中提取java.base.java.util.jar包,从中构建一个.jar,并将jar作为外部库导入到另一个项目中,这样我就可以修改其中包含的类中的一些方法的行为。
我似乎成功地提取了包,因为我能够消除项目中所有可能的预编译错误并构建.jar工件。我还可以将此.jar作为外部库导入到我的其他项目中。
编辑:java.util.jar外部的每个私有类(即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添加到两者的Compilation选项中,包含提取的java.util.jar包的项目和我想将其作为外部库导入的项目,都不起作用->错误仍然存在。
编译选项中的所有其他--add-exports在这两个项目上都可以正常工作。
我做错了什么?我必须改变什么才能让它工作?
注:如果事情不清楚,请随时询问!
编辑:我尝试使用我自己的'java.util.jar'而不是官方的代码(注意,目前两者都是相同的,唯一的区别是一个保留在JDK中,而另一个只是'最小可行产品')
这是不是this的重复,因为我(我已经指出了这一点)尝试了--add-exports,这是另一个问题的答案。
错误发生在4.行中,在那里JarFile构造函数被调用,它不会调用来自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;
    }
}

字符串

eqqqjvef

eqqqjvef1#

正如Nicolai's所指出的,--add-exports java.base/jdk.internal.misc=ALL-UNNAMED必须在编译(javac)**和运行(java)代码时完成。

hmae6n7t

hmae6n7t2#

有点晚了,但我在尝试OpenCV教程Java和JavaFX时遇到了这个问题,我将分享对我有用的东西。
1.为了能够编译,我需要将OpenJFX和OpenCV库添加到类路径中
1.不需要配置特殊的模块编译- Eclipse使用Java 11处理得很好
1.为了能够运行,我创建了一个启动快捷方式,它添加了VM参数,如下所示
--module-path /javafx-sdk-11.0.2/lib
--add-modules=javafx.controls,javafx.fxml
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED

dhxwm5r4

dhxwm5r43#

我分享我的解决方案围绕这个问题.我面对这个问题与一个不同的包.然而,这是我如何来解决它(我使用Eclipse):
假设我的类在一个名为stack.overflow.test的包中,并且我的模块名为stack,
我按照https://jenkov.com/tutorials/java/modules.html的说明将“exports overflow.test”添加到module-info.java文件中

相关问题