錯誤訊息
java.lang.ClassNotFoundException: IHello (no security manager: RMI class loader disabled)
原因分析
- 缺少 SecurityManager:RMI 預設停用遠端類別載入,需安裝
RMISecurityManager 或自訂 SecurityManager。
- Stub/Interface 類別未在 Client 端可用:Client 必須能載入遠端介面 (
IHello) 與 Stub 類別。
java.rmi.server.codebase 未正確設定:Server 啟動時需指定 -Djava.rmi.server.codebase=https://host:port/classes/,讓 Client 能下載類別。
解決步驟
- Server 啟動參數:
java -Djava.rmi.server.codebase=https://server-ip:8080/classes/ \
-Djava.security.policy=server.policy \
ServerMain
server.policy 內容:
grant {
permission java.security.AllPermission;
};
- Client 端同樣需設定
SecurityManager 與 codebase(若需動態下載)。
- 確保
IHello.class、HelloImpl_Stub.class 放在 HTTP 伺服器對應路徑。
替代方案
- 將介面與 Stub 打包至 Client 專案,避免動態下載(簡單部署)。
- 改用 HTTP/REST、gRPC 等現代化 RPC 框架,避開 RMI 複雜的類別載入機制。
參考資源
Java RMI 詳細教學與常見錯誤排查