GroovyClassLoader и импорт

Я использую GroovyClassLoader в своем классе Java для анализа определенного (идеально сложного) файла groovy (который должен быть выполнен на следующем шаге):

Вызов MyClass.java

final Class parsedClass = groovyClassLoader.parseClass(groovyFile);

Знаю это:

  • Файлы Groovy должны храниться в файловой системе, потому что их нужно будет изменить без повторного развертывания.
  • Этот заводной файл потребует несколько импортов:

Импорт GroovyFile.groovy

import com.my.import.one.Import1DTO
import com.my.import.two.Import2DTO
import com.my.import.three.Import3DTO
import com.my.import.four.Import4DTO
import com.my.import.five.Import5DTO

При вызове метода parseClass возникает это исключение:

Исключения

unable to resolve class com.my.import.one.Import1DTO;
unable to resolve class com.my.import.two.Import2DTO;
unable to resolve class com.my.import.three.Import3DTO;
unable to resolve class com.my.import.four.Import4DTO;
unable to resolve class com.my.import.five.Import5DTO;

Могу ли я получить ожидаемое поведение без синтаксического анализа каждого класса импорта перед синтаксическим анализом базового класса?

Спасибо!


person Antonio Acevedo    schedule 19.02.2014    source источник


Ответы (1)


Вот пример MyClass.java, который использует метод addClasspath() для GroovyClassLoader

import groovy.lang.GroovyClassLoader;

public class MyClass {
    public static void main(String... args) {
        GroovyClassLoader groovyClassLoader = new GroovyClassLoader();

        // add "lib" to the classpath
        groovyClassLoader.addClasspath("lib");

        String groovyFile = "GroovyFile.groovy";
        Class parsedClass = groovyClassLoader.parseClass(groovyFile);
        System.out.println("class is " + parsedClass.toString());
    }
}

Я предполагаю, что DTO написаны на Groovy и что мы используем «myimport», так как «my.import.x» завершится ошибкой из-за недопустимого синтаксиса. Если у нас есть такой каталог "lib" с скомпилированными классами:

lib/com/myimport/one/Import1DTO.groovy
lib/com/myimport/one/Import1DTO.class
lib/com/myimport/two/Import2DTO.groovy
lib/com/myimport/two/Import2DTO.class

и что GroovyFile.groovy существует в основном каталоге. например

import com.myimport.one.Import1DTO
import com.myimport.two.Import2DTO

println "hi there"

то приведенный выше код Java работает для меня.

Я использую Groovy 2.2.1 с groovy-all-2.2.1.jar в пути к классам (для GroovyClassLoader).

person Michael Easter    schedule 20.02.2014
comment
Спасибо! Продолжая ваш пример, я полагаю, что повторное развертывание не требуется. Если я внесу некоторые изменения в Import1DTO.groovy, Import2DTO.groovy или GroovyFile.groovy, но что произойдет, если я создам новый Import3DTO.groovy с требуемым Import3DTO.class? - person Antonio Acevedo; 20.02.2014