【问题标题】:Grails 2.3.x: How to get plugin name when running plugin by itself?Grails 2.3.x:单独运行插件时如何获取插件名称?
【发布时间】:2014-03-20 01:55:15
【问题描述】:

在我的 Grails 2.3.5 插件描述符文件中,我试图获取插件名称或应用名称,这取决于它是作为普通 Grails 应用运行还是插件正在运行通过它自己。后者我遇到了麻烦。

我在 doWithSpring 闭包中尝试了以下内容:

application.metadata.getApplicationName()
application.metadata['app.name']
appName
application.config.appName
this.plugin.name

所有这些都是 null 或空 Map。

我觉得我必须以某种方式访问​​当前的 GrailsPluginGrailsPluginUtils,但我在那里没有取得任何进展。

【问题讨论】:

  • 独立运行插件 - 什么意思?
  • cd myGrailsPlugin; grails 运行应用程序
  • 知道了。应该使用像tomcat这样的容器吗?确保它没有与插件一起导出。
  • 同意,只有在用于dev 工作时才会被调用。

标签: grails grails-plugin


【解决方案1】:

您可以尝试在插件描述符中使用它。

import grails.util.Holders

....

def doWithSpring = {
    //gives plugin name while using through app
    def appName = manager.getGrailsPluginForClassName(this.class.simpleName).name

    //gives plugin project name
    def name = Holders.config.grails.plugin.myplugin.name
}

Config.groovy 的变化

grails.plugin.myplugin.name=appName

通过应用程序使用插件时,此配置条目不应污染。当插件通过应用程序运行时,您会得到上面name 的空地图。

【讨论】:

  • 这确实给了我 appName 但格式错误。它返回 camelCase 版本 (myPlugin) 但我实际上需要项目名称,这是您在控制台中使用 grails run-app 时看到的上下文路径。例如。 Server running. Browse to http://localhost:8080/my-plugin/.
  • Config.groovy 中,appName 仍然是null。另外,也许我错过了一些东西,但这些编辑似乎依赖于硬编码值myplugin。在这种情况下,我也可以简单地在插件描述符中对我需要的字符串值 (my-plugin) 进行硬编码。我最初的用例是能够检测名称,以便如果插件被重命名,那么代码将继续工作。
  • 不涉及硬编码。 Config.groovy 中的appName 实际上会从插件中读取application.properties 文件并获取插件名称。我可以通过硬编码名称来回答最简单的方法,但这是完全动态的。这个对我有用。我随意选择了config属性。
  • app.name 从我的application.properties 文件中丢失 - 正如burtbeckwith.com/blog/?p=1973 所建议的那样 - “从 application.properties 中删除除 app.grails.version 属性之外的所有内容”。因此我无法测试您的grails.plugin.myplugin.name=appName,所以我假设myplugin 是当前项目的卡编码字符串,而不是获取当前插件的变量。是的,它现在可以工作了,感谢您的耐心等待。
【解决方案2】:

@dmahapatro 的回答让我得到了想要的结果,所以我将他的回答标记为正确。

但我遇到的根本问题实际上是由于application.properties - app.name 中缺少属性。所以我从cmets中提取了相关信息,放在这个答案中,以备日后参考。

我使用 Burt Beckwith 在Converting Grails Applications to Plugins and vice versa 上的非常有用的指导将 Grails 应用程序转换为插件。他在其中建议:

从 application.properties 中删除所有内容,除了 app.grails.version 属性

这就是我最初使用 application.metadata.getApplicationName() 的尝试返回 null 的原因。

app.name 添加回 application.properties,修复此问题,以便 application.metadata.getApplicationName() 为我提供所需的值。

其他人在博客的 cmets 中指出了这个遗漏,但 Burt 没有更新他的文章或回复评论,所以我不能断然说你应该在每个插件中添加 app.name,只是它对我有用此实例 (YMMV)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多