1

尝试使用 Groovy 中的 commons-vfs 同步 ant 任务。解决了大部分问题,但仍然存在一些问题。这是我的常规脚本:

@Grapes([
  @Grab(group='org.apache.commons', module='commons-vfs2', version='2.0'),
  @Grab(group='com.jcraft', module='jsch', version='0.1.53'),
  @GrabConfig(systemClassLoader = true)
])

import groovy.xml.NamespaceBuilder
import groovy.io.FileType

localRootDir = 'forUpdateSite'
updateServer = 'some.remote.server.com'
remoteRootDir = '/var/www/directory'

println("Syncing files from ${localRootDir} to ${updateServer} ${remoteRootDir}");

def ant = new AntBuilder()
def vfs = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.commons.vfs2.tasks')
def remoteURI = "sftp://username:{FAKEENCRYPTEDPASSWORD}@${updateServer}${remoteRootDir}"
vfs.sync (destdir: remoteURI) {
  src() {
    file: localRootDir
  }
}

此时我唯一缺少的是如何指定本地目录和文件。这个例子给了我这个堆栈跟踪:

Syncing files from forUpdateSite to some.remote.server.com /var/www/directory

Caught: : No source file specified.
: No source file specified.
    at org.apache.commons.vfs2.tasks.AbstractSyncTask.addConfiguredSrc(AbstractSyncTask.java:149)
    at org.apache.tools.ant.IntrospectionHelper$AddNestedCreator.istore(IntrospectionHelper.java:1469)
    at org.apache.tools.ant.IntrospectionHelper$AddNestedCreator.store(IntrospectionHelper.java:1463)
    at org.apache.tools.ant.IntrospectionHelper$Creator.store(IntrospectionHelper.java:1370)
    at org.apache.tools.ant.UnknownElement.handleChild(UnknownElement.java:582)
    at org.apache.tools.ant.UnknownElement.handleChildren(UnknownElement.java:349)
    at org.apache.tools.ant.UnknownElement.configure(UnknownElement.java:201)
    at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)
    at syncToUpdateSite.run(syncToUpdateSite.groovy:53)
4

1 回答 1

0

结果很简单:

@Grapes([
  @Grab(group='org.apache.commons', module='commons-vfs2', version='2.0'),
  @Grab(group='com.jcraft', module='jsch', version='0.1.53'),
  @GrabConfig(systemClassLoader = true)
])

import groovy.xml.NamespaceBuilder
import groovy.io.FileType

localRootDir = 'forUpdateSite'
updateServer = 'some.remote.server.com'
remoteRootDir = '/var/www/directory'

println("Syncing files from ${localRootDir} to ${updateServer} ${remoteRootDir}");

def ant = new AntBuilder()
def vfs = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.commons.vfs2.tasks')
def remoteURI = "sftp://username:{FAKEENCRYPTEDPASSWORD}@${updateServer}${remoteRootDir}"
vfs.sync (destdir: remoteURI,
          src: localRootDir)

请注意,您必须包含 jsch 模块@Grab才能使 sftp URL 解析工作。在我包含之前,我得到了下面的堆栈跟踪。

Caught: : Badly formed URI "sftp://username:***@some.remote.server.com/var/www/directory".
: Badly formed URI "sftp://username:***@some.remote.server.com/var/www/directory".
    at org.apache.commons.vfs2.tasks.AbstractSyncTask.execute(AbstractSyncTask.java:227)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at syncToUpdateSite.run(syncToUpdateSite.groovy:52)
Caused by: org.apache.commons.vfs2.FileSystemException: Badly formed URI "sftp://username:***@some.remote.server.com/var/www/directory".
    at org.apache.commons.vfs2.provider.url.UrlFileProvider.findFile(UrlFileProvider.java:91)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:713)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:649)
    at org.apache.commons.vfs2.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:636)
    at org.apache.commons.vfs2.tasks.VfsTask.resolveFile(VfsTask.java:56)
    at org.apache.commons.vfs2.tasks.AbstractSyncTask.handleFiles(AbstractSyncTask.java:247)
    at org.apache.commons.vfs2.tasks.AbstractSyncTask.execute(AbstractSyncTask.java:218)
    ... 3 more
Caused by: java.net.MalformedURLException: unknown protocol: sftp
    at org.apache.commons.vfs2.provider.url.UrlFileProvider.findFile(UrlFileProvider.java:72)
    ... 9 more
于 2015-10-09T21:21:52.703 回答