常春藤安装任务第一次失败并出现 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"/>

fromRepotoRepo 在本地 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:权限被拒绝

无法连接到sftp:com.jcraft.jsch.JSchException:算法协商失败

JSch - Java实现的SFTP(文件下载详解篇)

使用 JSch 通过 SFTP 或 SCP 更改文件权限

使用 Java JSch 进行 SFTP 文件传输