Grails - определите, находится ли класс артефактов в данном подкаталоге grails-app - PullRequest
1 голос
/ 14 января 2010

Я реализую ArtefactHandler , и я хочу иметь возможность создавать артефакты из Script s (для поддержки устаревшего формата). Я не хочу превращать все сценарии в артефакты, а только в конкретный подкаталог приложения grails, скажем grails-app/foo/.

Я застрял в попытке выяснить путь артефакта из моего ArtefactHandler isArtefactClass метода. Есть ли способ получить путь к исходному источнику класса или иначе определить, содержится ли он в grails-app/foo?

Ответы [ 2 ]

1 голос
/ 15 января 2010

Grails на самом деле не волнует, где в файловой системе находятся ваши классы. Вот только дым и зеркала. Таким образом, в настоящее время нет поддержки артефактов на основе определения местоположения, но есть билет для этого: http://jira.codehaus.org/browse/GRAILS-2174

Между тем, самое простое решение - заставить ваши скрипты иметь определенное соглашение об именах или, возможно, ввести какую-то аннотацию маркера. Я не уверен, как анализировать скриптовые классы, хотя ищу аннотации.

0 голосов
/ 15 января 2010

У Люка есть официальный ответ выше, но вот взлом, который я придумал:

if (Script.class.isAssignableFrom(clazz)
    && ((DefaultGrailsApplication) ApplicationHolder.getApplication()).
        getResourceLoader().loadGroovySource(clazz.getName()).
        getPath().contains("grails-app/foo")) {
    return true;
}

Что, вероятно, имеет много проблем. Во-первых, он использует DefaultGrailsApplication, являющуюся реализацией GrailsApplication, поэтому мы нарушаем инкапсуляцию. Во-вторых, похоже, что loadGroovySource возвращает значение NULL для встроенных артефактов (таких как метки), поэтому это может не сработать для таких вещей, как плагины и все, что распространяется в двоичной форме.

РЕДАКТИРОВАТЬ: похоже, он даже не будет работать в производстве. Вернуться к чертежной доске ...

...