Java 我可以避免在Groovy中使用Grape加载模块吗?

Java 我可以避免在Groovy中使用Grape加载模块吗?,java,maven,groovy,grape,Java,Maven,Groovy,Grape,我正在用groovy编写我的第一个自动化脚本,我遇到了一个障碍。 在使用AntBuilder类运行sshexec()时,我遇到以下错误: : Problem: failed to create task or type sshexec Cause: the class org.apache.tools.ant.taskdefs.optional.ssh.SSHExec was not found. This looks like one of Ant's optional compone

我正在用groovy编写我的第一个自动化脚本,我遇到了一个障碍。 在使用AntBuilder类运行sshexec()时,我遇到以下错误:

: Problem: failed to create task or type sshexec
Cause: the class org.apache.tools.ant.taskdefs.optional.ssh.SSHExec was not found.
    This looks like one of Ant's optional components.
Action: Check that the appropriate optional JAR exists in
    -ANT_HOME\lib
    -the IDE Ant configuration dialogs

Do not panic, this is a common problem.
The commonest cause is a missing JAR.

This is not a bug; it is a configuration problem
到目前为止,我找到的最佳解决方案是使用

Grape.grab(group : "com.jcraft", module : "jsch", classLoader : this.class.classLoader.rootLoader)
Grape.grab(group:"ant", module:"ant-jsch", classLoader:this.class.classLoader.rootLoader)
以便加载所需的模块。 但是,我想消除Grape从远程Maven存储库下载JAR的延迟时间


有没有办法下载和保存模块以备将来使用,可能是在JAVA_路径或类似的方式?

假设您只需要在几台机器上运行代码,我会创建一个grapeConfig.xml文件,并将ivy.cache.ttl.default设置为30天左右。这将告诉Grape,如果您有一个依赖项,它使用一个版本范围,每30天只检查一次远程存储库中更新的依赖项。有关更多详细信息,请参阅。

在运行时使用Grape注释下载脚本依赖项:

@Grapes([
    @Grab(group='org.apache.ant', module='ant-jsch', version='1.8.3'),
    @GrabConfig(systemClassLoader=true)
])

def ant = new AntBuilder()

ant.sshexec(host:"somehost", username:"yo", password:"dude", command:"ls")
如果您位于防火墙后面,还可以配置Maven存储库的位置:

@GrabResolver(name="my-repo", root="http://my.hostname/maven/repo")
最后一个提示,属性groovy.grape.autoDownload可用于控制grape是进行远程下载还是仅使用其缓存文件

groovy -Dgroovy.grape.autoDownload=false myscript.groovy

将所需JAR添加到%ANT_HOME%和%GROOVY_HOME%无法工作

解决方案是将jar放在%USERPROFILE%.groovy\lib下,之后就不再需要Grape调用了。希望这对其他有同样问题的人有用

谢谢你让我走上正轨

  • 请参阅“向类路径添加内容”标题

人工制品应缓存在user.home\u dir/.m2/存储库中。。。这个程序在第二次运行时不是运行得更快吗?不幸的是,它在随后的运行中运行得同样慢。似乎没有缓存,我的用户下也没有.m2目录。Win机器上的路径是否不同?repo仍在windows上的主目录下。你所需要的只是类路径上正确的JAR,不管它们是如何到达那里的。Dave,在将JAR添加到类路径后,是否需要进行任何配置?此外,Groovy类路径与Java类路径是否有区别?到目前为止,我所找到的文档一直缺乏,只有一个类路径;我使用的系统的一个限制是groovy脚本是唯一允许的文件。尝试解决混乱问题。在将它们放在环境范围内的位置时,我会有点谨慎,因为在运行其他脚本时,您可能需要不同的库,或者相同库的不同版本。如果您确实有只使用Groovy文件的限制(顺便说一句,这是一个奇怪的限制!),那么您可能没有选择,但它可能会导致后续问题。好的想法是通过用一个包罗万象的Groovy脚本替换.bat和ant.xml文件来清理当前的构建配置,然而,在groovy中,替换ant-sshexec调用并不是一蹴而就的。如果有一种更干净的方法在本地安装库,而不是每次都下载,我会全神贯注:)尽量避免使用Grape,因为这似乎会使我认为应该是一个简单的配置问题变得复杂。不过,不应该每次都下载它们。把jar放在类路径上(我的意思是假设没有葡萄)就足够了。也许我误解了类路径,当我在终端中
echo%classpath%
时,它引用了一个特定的jar文件。我应该把下载的jar放在和这个相同的文件夹中吗?不,类路径包含Java应用程序可用的所有jar文件和类目录的列表。