lookupScriptFiles "true" в методе loadClass()
Расширенный GroovyClassloader и переопределить метод loadclass
Если я сделаю lookupScriptFiles
"true
" в loadClass()
метод, который запускает скрипт, и не требует оператора импорта, ссылающегося на класс groovy в другом пакете
я расширил GroovyClassloader и переопределил метод loadclass в аргументе loadclass lookupScriptFiles =true
Когда это так, он успешно компилируется даже first.groovy без оператора import
когда lookupScriptFiles=false
выдает ошибку компиляции, как и ожидалось.
my source code snippet
C:\>cat first.groovy
def cos=new Second()
==============================================================
C:>cat Second.groovy
package com.test
class Second
{
Second()
{
println "Anish"
}
}
=========================================================
C:\bin>echo %CLASSPATH%
C:\zGroovy\bin;C:\vsexclude\opt\groovy-1.7.2\embeddable\groovy-all-1.7.2.jar
===============================================
C:\vsexclude\trees\bac-4.2\workspace\zGroovy\bin>java GCtest
path------>>C:\first.groovy
Anish
=================================
import groovy.lang.GroovyClassLoader;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilerConfiguration;
/**
* @author Anish
*/
public class GCloader extends GroovyClassLoader {
public GCloader(ClassLoader parent) {
super(parent, new CompilerConfiguration());
}
@Override
public Class<?> loadClass(final String name, boolean lookupScriptFiles,
boolean preferClassOverScript, boolean resolve)
throws ClassNotFoundException, CompilationFailedException {
//return loadFiles(name, true, preferClassOverScript, resolve);
return super.loadClass(name, true,
preferClassOverScript, resolve);
}
}
1 ответ
Предполагая, что ваш вопрос:
Если я установлю
lookupScriptFiles
вtrue
можно удалить операторы импорта из моих скриптов groovy?
Тогда ответ - нет. Загрузчик классов попытается найти сценарии, о которых он не знает, но вам все равно потребуется импорт, чтобы указать, в каких пакетах искать каждый класс.
Обновить
Итак, у вас есть два groovy файла в одном каталоге, в один из которых вы произвольно добавили оператор пакета.
Я предполагаю, что вы загружаете классы прямо из сценариев (еще одна вещь, которую вы не говорите в своем вопросе)
Если это так, то вам нужно указать загрузчику классов, чтобы он поискал другие сценарии для компиляции в классы.
Если вы этого не сделаете - как вы видели - это не будет работать (импорт или импорт)
Тем не менее, помещать два одинаковых файла в одну папку и просто добавлять строку пакета в один из них - ужасная практика кодирования, и я удивлен, что у вас все получилось