常春藤安装任务第一次失败并出现 JSCH SFTP 错误 4,但在后续尝试中成功
Posted
技术标签:
【中文标题】常春藤安装任务第一次失败并出现 JSCH SFTP 错误 4,但在后续尝试中成功【英文标题】:Ivy Install task fails with JSCH SFTP error 4 first time, but is successful on subsequent attempts 【发布时间】:2021-07-03 12:20:15 【问题描述】:我正在尝试使用 ANT Ivy install task 将库从一个存储库复制到另一个存储库。
我的 ANT 目标中的一些示例代码:
<ivy:install organisation="testOrg" module="testModuleName" revision="1.2.3" from="fromRepo" to="toRepo"/>
fromRepo 和 toRepo 在本地 ivysettings.xml 文件中定义。
库的解析(来自 fromRepo)成功,但安装到 toRepo 失败,出现SFTP Code 4 error。
impossible to install testOrg#testModuleName;1.2.3: java.io.IOException: Failure
at org.apache.ivy.plugins.repository.sftp.SFTPRepository.put(SFTPRepository.java:164)
at org.apache.ivy.plugins.repository.AbstractRepository.put(AbstractRepository.java:130)
at org.apache.ivy.plugins.resolver.RepositoryResolver.put(RepositoryResolver.java:234)
at org.apache.ivy.plugins.resolver.RepositoryResolver.publish(RepositoryResolver.java:215)
at org.apache.ivy.core.install.InstallEngine.install(InstallEngine.java:150)
at org.apache.ivy.Ivy.install(Ivy.java:537)
at org.apache.ivy.ant.IvyInstall.doExecute(IvyInstall.java:102)
at org.apache.ivy.ant.IvyTask.execute(IvyTask.java:271)
...
Caused by: 4: Failure
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2833)
at com.jcraft.jsch.ChannelSftp.mkdir(ChannelSftp.java:2142)
at org.apache.ivy.plugins.repository.sftp.SFTPRepository.mkdirs(SFTPRepository.java:186)
at org.apache.ivy.plugins.repository.sftp.SFTPRepository.mkdirs(SFTPRepository.java:184)
at org.apache.ivy.plugins.repository.sftp.SFTPRepository.put(SFTPRepository.java:160)
... 37 more
但是,如果我只是再次运行相同的目标,安装就会成功完成!
从堆栈跟踪中的com.jcraft.jsch.ChannelSftp.mkdir(ChannelSftp.java:2142)
创建目录似乎有些问题。
第一次运行后,testOrg/testModuleName目录存在(只有testOrg之前存在过)。
第二次运行 testOrg/testModuleName/1.2.3 目录被创建(连同库工件)。
如果在第一次运行后我删除了它创建的testOrg/testModuleName目录,它会继续返回代码4错误。
我的 ANT 库目录包含:jsch-0.1.50.jar,我认为它用于上传到目标 Ivy 服务器。
另外我正在使用:
蚂蚁 1.8.4 常春藤 2.4.0 Java 1.7.0_80【问题讨论】:
【参考方案1】:通过调试在目标 toRepo 存储库上创建新目录的 Ivy SFTP 源代码,我能够了解发生这种情况的原因。 代码在方法中:SFTPRepository.mkdirs() 如果每个目录不存在,则递归调用自身以生成路径中的每个目录。
对于我的示例,上传的目录是: /toRepo/testOrg/testModuleName//1.2.3/
您可以在路径中间看到双斜杠://。 这意味着 mkdirs() 方法尝试创建 testModuleName 目录两次。第二次失败导致代码4错误。
路径中有双斜线的原因是因为该工件没有分支。
在我的 ivy 设置文件中,sftp 解析器(用于我的 toRepo 存储库)工件 patterns 被配置为:
<ivy pattern="/toRepo/[organisation]/[module]/[branch]/[revision]/ivy-[revision].xml"/>
<artifact pattern="/toRepo/[organisation]/[module]/[branch]/[revision]/[artifact]-[revision].[ext]"/>
模式的 /[branch]/ 部分是在路径中生成 // 的部分。 有 2 种配置,一种用于 ivy.xml 文件本身,另一种用于所有其他工件。
常春藤模式允许对模式的可选部分使用括号。 所以将我的配置更改为:
<ivy pattern="/toRepo/[organisation]/[module](/[branch])/[revision]/ivy-[revision].xml"/>
<artifact pattern="/toRepo/[organisation]/[module](/[branch])/[revision]/[artifact]-[revision].[ext]"/>
修复了问题,ivy 安装按预期运行。 这意味着对于没有定义分支的反事实(如 3rd 方工件),分支目录将不会包含在路径中。
【讨论】:
以上是关于常春藤安装任务第一次失败并出现 JSCH SFTP 错误 4,但在后续尝试中成功的主要内容,如果未能解决你的问题,请参考以下文章
并发下sftp连接报错——com.jcraft.jsch.JSchException: connection is closed by foreign host
JSch SFTP 放入 IBM z/OS 失败:无法写入文件;嵌套异常为 3:权限被拒绝