Java clj ssh/JSch无法加载库';c';在窗户上
我已经将CLJSH作为依赖项添加到Leiningen项目中,我可以Java clj ssh/JSch无法加载库';c';在窗户上,java,ssh,clojure,jna,jsch,Java,Ssh,Clojure,Jna,Jsch,我已经将CLJSH作为依赖项添加到Leiningen项目中,我可以(使用'cljsh.ssh),但是调用(ssh代理{})会出现错误 UnsatisfiedLinkError Unable to load library 'c': The specified module cannot be found. at com.sun.jna.NativeLibrary.loadNativeLibrary ... at org.jcraft.jsch.agentproxy.usocket.JNAUSoc
(使用'cljsh.ssh)
,但是调用(ssh代理{})
会出现错误
UnsatisfiedLinkError Unable to load library 'c': The specified module cannot be found.
at com.sun.jna.NativeLibrary.loadNativeLibrary
...
at org.jcraft.jsch.agentproxy.usocket.JNAUSocketFactory$CLibrary.(clinit)
...
有人知道这是为什么吗?我认为这可能与Windows没有附带C标准库有关,在这种情况下,是否可以安装例如cygwin帮助?尝试安装cygwin,并添加如下内容:
-Djava.library.path=...path to lib dir ...
如果它自己找不到图书馆 我是的作者,它已在cljsh中使用
我认为它对cygwin的ssh代理不起作用,因为JNA不提供
它的本地库。试试Putty的选美怎么样?如果需要在cygwin环境中使用cygwin的ssh代理和“nc”命令出口,那么使用如何?我对CLJSH不太熟悉,但据介绍,可以使用NCUSocketFactroy而不是JNAUSocketFactory
更新:
我已经确认我可以使用成功运行clj ssh
通过应用以下提交,在我的Cygwin环境上安装ssh代理
好的,在对源代码进行一些挖掘之后,似乎clj ssh在默认情况下尝试使用系统ssh代理(如果它与windows不兼容,这似乎是一种奇怪的行为)。这使得
cljsh.cli
无法使用,但是cljsh.ssh
可以修复
(ssh-agent {:use-system-ssh-agent false})
如果您确实想使用系统ssh代理,下面的clj ssh和ymnk自述文件提到PuTTY的选美,我找不到任何关于设置此代理的信息,但它应该可以通过cygwin实现。如果设置了
ssh\u AUTH\u SOCK
环境变量,我已经看到了这一点。在启动jvm之前清除此环境变量可能会解决此问题
当未设置SSH\u AUTH\u SOCK
时,如果正在运行,clj SSH应自动使用pageant
看起来最好的解决方案是根据ymnk的提交支持NCUSocketFactory,并添加关于cygwin的ssh代理的文档。很高兴接受这个请求。
libc
在windows上被称为msvcrt
(或多或少)。但是,我建议检查您的cljsh
文档,看看它们是否支持windows。有时,你可以用msvcrt
替换c
,但windows上的套接字与其他平台上的行为不同,因此除了简单的库替换之外,你还需要做一些工作。你可以插入cygwin1.dll
(或任何它的名称)来代替libc
加载,因为cygwin在windows上提供了API兼容性。为了避免需要更改Java代码,您可以尝试创建一个名为c.dll
的cygwin1.dll
副本,并将其放在路径中的某个位置,以便JNA可以找到它。基本上,您可以将cygwin dll表示为libc
。我曾尝试将JNA与cywgin一起使用,但我找不到如何做到这一点。如果可能的话,这对我来说是个好消息。好吧,可能离可行还有很长的路要走。这可能与制作名为c.dll
的cygwin1.dll
的副本一样简单,但可能要复杂得多。感谢这个答案,我没有意识到clj ssh正在寻找一个外部ssh代理,因此这促使我找出修复方法。顺便说一句,自述还顺便提到了选美比赛,但我找不到任何关于设置的信息。