我使用SSHJ在远程服务器上执行命令,连接方式如下:
private static void connect() {
try {
client = new SSHClient();
client.addHostKeyVerifier(new PromiscuousVerifier());
client.connect(HOST);
String path = System.getProperty("/**/user.home") + "/.ssh/id_rsa";
client.authPublickey(USER, client.loadKeys(path));
} catch (IOException e) {
logErrorAndRethrowException("Error connecting to server via SSH", e);
}
}当我在我的IDE中运行它时,它运行起来没有任何问题。但是,当我尝试使用Gradle在Jenkins环境中运行它时,我得到了以下堆栈跟踪:
Exception in thread "reader" java.lang.NoClassDefFoundError: org/bouncycastle/openssl/PEMParser
at net.schmizz.sshj.userauth.keyprovider.PKCS8KeyFile.readKeyPair(PKCS8KeyFile.java:131)
at net.schmizz.sshj.userauth.keyprovider.PKCS8KeyFile.getPrivate(PKCS8KeyFile.java:72)
at net.schmizz.sshj.userauth.method.KeyedAuthMethod.putSig(KeyedAuthMethod.java:59)
at net.schmizz.sshj.userauth.method.AuthPublickey.sendSignedReq(AuthPublickey.java:74)
at net.schmizz.sshj.userauth.method.AuthPublickey.handle(AuthPublickey.java:45)
at net.schmizz.sshj.userauth.UserAuthImpl.handle(UserAuthImpl.java:143)
at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:511)
at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107)
at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175)
at net.schmizz.sshj.transport.Reader.run(Reader.java:60)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.openssl.PEMParser
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more我尝试将bouncycastle添加为单独的依赖项(包括bcprov和bcpkix包),尽管SSHJ引入了它,但我还是尝试了一些版本,我尝试了启用和禁用Jenkins bouncycastle插件。我还尝试了schmizz SSHJ而不是Hierynomus。
我使用的是Java 8、Gradle 3.2.1 (原因)、Jenkins 2.190.3和Hierynomus SSHJ 0.27。
发布于 2019-12-07 04:25:53
我找到问题了。我正在导入的另一个依赖项是悄悄引入了一个旧版本的bouncycastle,它覆盖了SSHJ引入的那个版本。我排除了这种依赖,并解决了问题。
https://stackoverflow.com/questions/59219257
复制相似问题