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