私は現在、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;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加