classpath - 无法从类路径加载 jks 文件

标签 classpath encryption java-8 jks

我创建了一个带有公共(public)和私有(private) RSA key 的 JKS 文件。当我使用外部路径(如 c:/file.jks)加载此文件时,程序会像魅力一样执行。但是,如果我尝试从类路径加载相同的文件,我得到了这个异常:

java.io.IOException: Invalid keystore format

这是用于加载 jks 的代码:
 KeyStore keyStore = KeyStore.getInstance("JKS");
 InputStream stream=this.getClass().getResourceAsStream("/lutum.jks") ;
 keyStore.load(stream,passe);

唯一的区别是我在外部加载时使用带有完整路径的 FileInputStream。
我做错了什么?

最佳答案

一般来说,您的解决方案应该可以暂时起作用。

那些规定是什么?确保您的资源文件夹在您的类路径中。如果不确定,请将其添加到 -cp标志传递给 java在执行程序时,或者如果您使用的是 Eclipse 或其他 IDE,请确保它被列为该项目的类路径的成员。

接下来,check out this stackoverflow that relates to your question .虽然您使用类的 getResourceAsStream() 方法的方式是有效的(包括文件名开头的 / 导致类资源加载器遵循 ClassLoader 的方法),但直接使用 ClassLoader 可能不会那么困惑。 Another good example is found here .

因此,首先,检查您的资源文件夹是否明确包含在类路径中。其次,更喜欢以下构造来查找资源:

InputStream stream= this.class.getClassLoader().getResourceAsStream("lutum.jks");

注意缺少的 /从文件名。这是因为 ClassLoader 将自动从“项目根目录”开始搜索,而斜杠可能只会导致问题(例如,如果您部署到 JBoss 或 Tomcat,则可能会被类加载器解释为绝对文件系统路径的相对路径)。

我希望这有帮助。如果没有,请评论我有关您项目的更多详细信息,我会相应地更改我的答案。

关于classpath - 无法从类路径加载 jks 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104680/

相关文章:

java - 不兼容的类型 : inference variable T has incompatible bounds

java - 无法解析导入 javafx.embed.swing.SwingNode

java - 使用 CronTrigger 和 MySQL 做调度器时出现 ClassNotFoundException

java - SLF4J - 绑定(bind)被同一应用程序服务器上的其他应用程序覆盖

java - 在 UNIX 中将 xml 添加到 java 类路径

javascript - 如何确定PDF是否是加密的javascript客户端

Java 8 ConcurrentHashMap 初始化

java - 如何找到异常完成的 CompletableFuture

docker - mariadb 作为 docker 容器 - 主机安装绑定(bind)上的启动损坏

encryption - RSA公钥将ASCII值加密为0,如何解密?