我正在实施ArtefactHandler,我希望能够从Script
创建人工制品(以支持旧版格式)。我不想把所有的脚本都变成人工制品,而只是把它们放在grails-app的特定子目录中,比如说grails-app/foo/
。
我一直试图从ArtefactHandler
的{{1}}方法中弄清楚人工制品的路径。有没有办法获取类的原始源的路径,或以其他方式确定它是否包含在isArtefactClass
中?
答案 0 :(得分:1)
Grails实际上并不关心你的类在文件系统上的位置。那只是烟雾和镜子。因此,目前不支持基于位置的人工制品,但有一张票:http://jira.codehaus.org/browse/GRAILS-2174
与此同时,最简单的解决方案是强制您的脚本具有某种命名约定或可能引入某种标记注释。我不确定如何通过寻找注释来内省脚本类。
答案 1 :(得分:0)
卢克上面有正式答案,但这是我提出的黑客攻击:
if (Script.class.isAssignableFrom(clazz)
&& ((DefaultGrailsApplication) ApplicationHolder.getApplication()).
getResourceLoader().loadGroovySource(clazz.getName()).
getPath().contains("grails-app/foo")) {
return true;
}
这可能有很多问题。首先它依赖于DefaultGrailsApplication是GrailsApplication的实现,所以我们违反了封装。其次,看起来loadGroovySource
为内置的人工制品(如taglibs)返回null,所以这可能不适用于插件和以二进制形式分发的任何东西。