문제

작은 FTP 스크립트에 Groovy를 사용하고 싶었고이 게시물을 찾았습니다. http://www.hhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/몇 가지 의존성이 있었기 때문에 포도를 사용하고 싶었습니다. 모든 종속성은 캐시에 해결되어 존재합니다. 그러나 ANT가 다른 LIBS에서 선택적인 작업을 찾을 수는 없습니다. 항상 말합니다

Caught: : Problem: failed to create task or type ftp
Cause: the class org.apache.tools.ant.taskdefs.optional.net.FTP 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

        at GrabTest.runMe(GrabTest.groovy:15)
        at GrabTest.run(GrabTest.groovy:26)

그루비 버전 : 1.6.5 JVM : 1.6.0_15

다음은 내 소스 코드입니다

@Grab(group='ant', module='ant', version='[1.6.5,)')
@Grab(group='ant', module='ant-nodeps', version='[1.0,)')
@Grab(group='ant', module='ant-apache-oro', version='[1.0,)') 
@Grab(group='ant', module='ant-commons-net', version='[1.0,)') 
@Grab(group='apache-oro', module='jakarta-oro', version='[2.0.8,)')
@Grab(group='commons-net', module='commons-net', version='[1.4,)')
def runMe() {
    // works
    println getClass().getClassLoader().loadClass("org.apache.tools.ant.taskdefs.optional.net.FTP")

    def ant = new AntBuilder()

    println getClass().getClassLoader() //groovy.lang.GroovyClassLoader$InnerLoader
    println ant.getClass().getClassLoader() //org.codehaus.groovy.tools.RootLoader
    ant.ftp( server:"ftp.foo.com",
            userid:"user",
            password:"passwd",
            passive:"yes",
            verbose:"yes",
            remotedir:"/pub/incoming",
            binary:"yes" ) {
                fileset( dir:"." ) { include( name:"**/*.gz" ) }
            }
}

runMe()

보시다시피, 나는 클래스 로더가 문제라고 생각합니다. 포도는 그 종속성을 주입하지 않는 것 같습니다. 내가 어떻게 일할 수 있는지에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

당신은 클래스 로더가 문제의 근본이라고 의심되는 것을 의심합니다. 코드에서 이미 밝혀진 바와 같이, 앤트 빌더는 루트 로더에서로드되며 @grab 주석에 의해로드 된 클래스에 액세스 할 수 없습니다. 처럼 그루비 -3730 쇼, Groovy 1.7 이이 문제를 해결할 것입니다.

그러나 직접 사용하여 문제를 해결할 수 있습니다. groovy.grape.Grape.grab(Map dependency) 종속성을로드하는 데 사용해야하는 특정 클래스 로더를 설정할 수있는 방법 :

import groovy.grape.Grape;

Grape.grab(group:'ant', module:'ant', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
Grape.grab(group:'ant', module:'ant-nodeps', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
Grape.grab(group:'ant', module:'ant-apache-oro', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
Grape.grab(group:'ant', module:'ant-commons-net', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
Grape.grab(group:'commons-net', module:'commons-net', version:'1.4.1', classLoader:this.class.classLoader.rootLoader)
Grape.grab(group:'oro', module:'oro', version:'2.0.8', classLoader:this.class.classLoader.rootLoader)

다른 팁

또는 단순히 사용하십시오

@GrabConfig(systemClassLoader=true)

추가 정보를 찾을 수 있습니다. http://groovy.codehaus.org/grape

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top