import sun.security.tools.KeyTool; // 編譯錯誤:The import sun.security.tools.KeyTool cannot be resolved
專案依賴 rt.jar,且 JDK 版本為 **JDK 8 (1.8.x)**。
sun.*、com.sun.* 包屬於 **JDK 內部實現**,**非公共 API**,不保證跨版本兼容。
JDK 8 模塊化 (JEP 260) 將內部類封裝在 jdk.crypto.ec 等模塊中,**不再導出** `sun.security.tools.KeyTool`,導致編譯/運行時找不到類。
// 生成密鑰對
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
// 存儲 Keystore
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(null, null);
ks.setKeyEntry("alias", kp.getPrivate(), "keypass".toCharArray(),
new Certificate[]{ /* 自簽證書鏈 */ });
try (FileOutputStream fos = new FileOutputStream("keystore.p12")) {
ks.store(fos, "storepass".toCharArray());
}
ProcessBuilder pb = new ProcessBuilder(
"keytool", "-genkeypair",
"-alias", "mykey",
"-keyalg", "RSA",
"-keysize", "2048",
"-keystore", "keystore.p12",
"-storetype", "PKCS12",
"-storepass", "storepass",
"-keypass", "keypass",
"-dname", "CN=Test, OU=Dev, O=Company, L=City, ST=State, C=CN"
);
Process p = pb.start();
p.waitFor(); // 檢查 exitCode
安裝 JDK 7u80,修改項目編譯版本 1.7,`sun.security.tools.KeyTool` 重新可見。**僅作臨時過渡**,必須盡快遷移到方案一/二。
// 僅 JDK 9+ 有效
javac --add-exports java.base/sun.security.tools=ALL-UNNAMED ...
java --add-exports java.base/sun.security.tools=ALL-UNNAMED ...
ProcessBuilder 隔離進程,解析輸出/返回碼。maven-enforcer-plugin 禁止內部 API 依賴:從「依賴內部實現」轉向「標準 API + 進程隔離」,是 Java 項目長期穩定演進的必經之路。