运行jar文件时发生FileNotFoundException

时间:2018-11-26 10:47:59

标签: java rsa executable-jar filenotfoundexception jsch

在尝试运行此代码时,

public Session buildSSHConnection() throws Exception{

    String user = "user";
    int port = 22;
    Session session = null;
    try {
        JSch jsch = new JSch();
        jsch.addIdentity(this.getClass().getResource("beispiel.key").getFile());
        session = jsch.getSession(user, host, port);
        session.setConfig("StrictHostKeyChecking", "no");
    }catch(JSchException e) {
            session = null;
            throw e;
    }
    return session;
}    

在我的可运行jar文件中,我总是收到FileNotFoundException。

我知道通过我的检查时,文件beispiel.key存在于我的jar文件中

jar -tf ssh.jar 

Stacktrace是

com.jcraft.jsch.JSchException: java.io.FileNotFoundException: file:/home/sebastian/Schreibtisch/ssh.jar!/beispiel.key (Datei oder Verzeichnis nicht gefunden)
at com.jcraft.jsch.KeyPair.load(KeyPair.java:543)
at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:407)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:367)
at SSHConnection.buildSSHConnection(SSHConnection.java:49)
at SSHConnection.main(SSHConnection.java:64)

Caused by: java.io.FileNotFoundException: file:/home/sebastian/Schreibtisch/ssh.jar!/beispiel.key (Datei oder Verzeichnis nicht gefunden)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at com.jcraft.jsch.Util.fromFile(Util.java:508)
at com.jcraft.jsch.KeyPair.load(KeyPair.java:540)
... 5 more

我找到了一种可行的代码替代方法:

JSch jsch = new JSch();
InputStream in = this.getClass().getResourceAsStream("beispiel.key");
byte[] c = new byte[in.available()];
in.read(c);
jsch.addIdentity("rsa", c, null, null);

以Stream形式访问文件是可行的。我之所以没有尝试,是因为我无法找到字节数组的大小。

1 个答案:

答案 0 :(得分:0)

尝试在此行中设置文件所在的包名称:

jsch.addIdentity(this.getClass().getResource("THE_PACKAGE_NAME\beispiel.key").getFile());

如果不起作用,请尝试在软件包名称之前设置斜杠,例如:

jsch.addIdentity(this.getClass().getResource("\THE_PACKAGE_NAME\beispiel.key").getFile());