Grails 2.1.1 - 如何使用AstTransformer开发插件?

3
我想用一个类型为org.slf4j.Logger的对象来替换自动注入的log对象,后者的类型为org.apache.commons.logging.Log,以便我可以正确地使用Logback。因此,我需要创建一个...Transformer类(用Java编写)-这是我从“grails-user”邮件列表中得到的Graeme Rocher的建议。我也知道我必须将这个...Transformer类打包在插件中,并使它成为一个*.jar档案,然后将其加载到插件的lib/文件夹中。但我想我在做错了些什么,因为我已经有了这个类,还有一个包含MANIFEST.MF文件的META-INF文件夹,以及另一个名为services的文件夹,其中包含以下文件:org.codehaus.groovy.transform.ASTTransformation,该文件只包含一个字符串: ...Transformer类的规范名称。现在,如果我尝试运行grails package-plugin命令,控制台会出现java.lang.ClassNotFoundException错误。从堆栈跟踪中截取部分如下:
| Packaging Grails application...

| Error Fatal error during compilation org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:

Could not instantiate global transform class my.package.ast.LoggingTransformation specified at jar:file:/C:/Source/MyGrailsAST/lib/replace-logging-logback-ast.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation  because of exception java.lang.ClassNotFoundException: my.package.ast.LoggingTransformation

1 error

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:

Could not instantiate global transform class my.package.ast.LoggingTransformation specified at jar:file:/C:/Source/MyGrailsAST/lib/replace-logging-logback-ast.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation  because of exception java.lang.ClassNotFoundException: my.package.ast.LoggingTransformation

有没有人在处理 AstTransformer 方面有 Grails 插件的经验,能给我一些建议?是否有一篇很好的教程我还没有看过?

请告诉我 ;)

1个回答

1

经过一些研究、浏览和最终在Grails邮件列表(请参见邮件列表档案:http://grails.1312388.n4.nabble.com/Grails-user-f1312389.html)上询问后,我找到了一个解决方案。

我的目标是创建一个Globals ASTTransformation,将org.slf4j.Logger对象注入到每个没有注释的Artefact类中,而不是通常的org.apache.commons.logging.Log对象。

所以,以下是步骤:

我创建了一个类似于https://github.com/grails/grails-core/blob/master/grails-logging/src/main/groovy/org/codehaus/groovy/grails/compiler/logging/LoggingTransformer.java的Java类,但使用了我自己实现的org.slf4j.Logger对象。关键是将Java.class放置在以下包中:org.codehaus.groovy.grails.compiler

Grails会扫描在该包中使用@AstTransformer注释的类,并将其打包到一个JAR文件中,同时将其MANIFEST.MF文件放置在META-INF/文件夹中。如Graeme Rocher所述,不需要一个包含所有内容的META-INF/services目录:
“您不需要META-INF/services内容,我建议删除它,因为它可能会使事情变得更加复杂。”
因此,我想这个说法更多地与我的具体问题有关,因为我的插件中只有一个@AstTransformer类,但这只是猜测。我还没有在这个主题上搜索更多信息。也许这里的其他开发人员需要做一些研究,并在本主题中分享他的解决方案...
应该将JAR导入插件并放置在lib/目录下。之后,您应该能够执行grails clean、grails compile和grails package-plugin命令。

如果你想像我一样替换log实现,你应该从指定项目的类路径中排除grails-logginggrails-plugin-log4j JARs。这可以在BuildConfig.groovy文件中完成:

inherits("global") {
  excludes "grails-plugin-log4j", "grails-logging"
}

现在安装您的插件 grails install-plugin \path\to\plugin.zip,一切都应该按预期工作。

希望这可以帮助到您...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接