java.lang.IllegalAccessError:モジュールが名前のないモジュールにエクスポートされないため、クラスにアクセスできません

whme:

私は現在、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両方のコンパイルオプションに、抽出されたjava.util.jarパッケージで構成されるプロジェクトと外部ライブラリとしてインポートしたいプロジェクト、どれも動作しませんでした->エラーが続きます

--add-exportsコンパイルオプションにあるその他すべては、両方のプロジェクトで正常に動作します。

何が悪いのですか?それが機能するために何を変更する必要がありますか?

注:不明な点がある場合は、お気軽にお問い合わせください。

編集:公式のものではなく自分の「java.util.jar」を使用しようとするコード(現時点では両方が同一であることに注意してください、唯一の違いは、一方がjdk内に留まり、もう一方が単に「最小限実行可能な製品 ')

これは、重複しない、この I(と私はすでにそのうちの指摘)しようとしたとして--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;
    }
}
whme:

Nicolaiのこの質問回答で指摘され--add-exports java.base/jdk.internal.misc=ALL-UNNAMEDているように、コードのコンパイル時(javac)実行時(java)に実行する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

  2. 2

    ソートされた検索、ターゲット値未満の数をカウント

  3. 3

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  4. 4

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  5. 5

    Ansibleで複数行のシェルスクリプトを実行する方法

  6. 6

    Reactでclsxを使用する方法

  7. 7

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  8. 8

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  9. 9

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  10. 10

    PowerShellの分割ファイルへのヘッダーの追加

  11. 11

    Chromeウェブアプリのウェブビューの高さの問題

  12. 12

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  13. 13

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  14. 14

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  15. 15

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  16. 16

    MLでのデータ前処理の背後にある直感

  17. 17

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  20. 20

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  21. 21

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

ホットタグ

アーカイブ