سؤال

وكنت أرغب في استخدام رائع لبرنامج نصي بروتوكول نقل الملفات القليل وجدت هذه الوظيفة <لأ href = "http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ "يختلط =" noreferrer "> http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ منذ كانت هناك عدة تبعيات أردت أن استخدام العنب. يتم حل كافة التبعيات والحاضر في ذاكرة التخزين المؤقت. ولكن لا أستطيع الحصول على النملة للعثور على المهام الاختيارية في يبس أخرى. وتقول دائما

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()

وكما ترون أظن أن classloader من كونها مشكلة، يبدو أن العنب لا حقن تبعيات هناك. أي فكرة كيف يمكن الحصول عليه للعمل؟

هل كانت مفيدة؟

المحلول

أنت الاشتباه حق classloader أن جذر المشكلة. كما يكشف التعليمات البرمجية بالفعل، يتم تحميل AntBuilder من RootLoader، التي لم يكن لديك الوصول إلى الطبقات تحميلها من قبل الشرحGrab. كما رائع-3730 معارض، رائع 1.7 يجري لمعالجة هذه المشكلة.

ومع ذلك، يمكنك حل المشكلة عن طريق مباشرة باستخدام طريقة groovy.grape.Grape.grab(Map dependency)، والتي يمكنك وضع classloader المحددة التي ينبغي أن تستخدم لتحميل التبعيات:

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