Ivy 安装任务第一次失败并出现 JSCH SFTP 错误 4,但在后续尝试中成功

Ivy Install task fails with JSCH SFTP error 4 first time, but is successful on subsequent attempts

我正在尝试使用 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目录后,它会继续return代码4错误。

我的 ANT 库目录包含:jsch-0.1.50.jar 我假设它用于上传到目标常春藤服务器。

此外我正在使用:

通过调试在目标 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 模式允许对模式的可选部分使用括号。 所以将我的配置更改为:

<ivy pattern="/toRepo/[organisation]/[module](/[branch])/[revision]/ivy-[revision].xml"/>
<artifact pattern="/toRepo/[organisation]/[module](/[branch])/[revision]/[artifact]-[revision].[ext]"/>

问题已解决,ivy 安装按预期运行。 这意味着对于没有定义分支的反事实(如第 3 方工件),分支目录将不会包含在路径中。