3

tl;博士版

我的自定义 grails 插件的依赖项没有被我安装插件的项目继承和解决。

  • 将最新版本的发布插件安装到您的插件(修复 jar 依赖项的问题)
  • 清除对您的 BuildConfig.groovy 文件中可能存在的插件的任何引用(修复插件依赖项的问题)
  • grails maven-install使插件在 mavenLocal() 源中可用

长版

因此,我一直在尝试创建一个自定义 grails 插件以供我的大学内部使用。

如果将插件放入 BuildConfig.groovy 文件的 plugins 闭包中,我真的很喜欢它不仅会自动安装插件,而且会自动安装在其 BuildConfig.groovy 文件中为插件定义的所有依赖项(或者,在打包之后,它的 dependencies.groovy文件)。

查看说明,我已经在存储库关闭中为我的项目设置了 BuildConfig.groovy 文件:

flatDir name:'my-plugin', dirs:'/Users/me/workspace-ggts/myplugin'

然后将其添加到插件闭包中:

compile(":grails-my-plugin:0.1")

这确实正确安装了插件,但它不能解决任何插件的依赖项或所需的插件。这是插件的 BuildConfig.groovy 文件中的三个主要闭包:

repositories {
    grailsCentral()
    mavenCentral()
    mavenRepo "http://www.mygrid.org.uk/maven/repository"
    def jbossResolver = new org.apache.ivy.plugins.resolver.URLResolver()
    jbossResolver.addArtifactPattern("https://repository.jboss.org/nexus/content/groups/public-jboss/com/sun/media/[module]/[revision]/[artifact]-[revision].[ext]")
    jbossResolver.addArtifactPattern("https://repository.jboss.org/nexus/content/groups/public-jboss/javax/media/[module]/[revision]/[artifact]-[revision].[ext]")
    resolver jbossResolver
}
dependencies {

    compile (
        [group:'javax.media', name:'jai-core', version:'1.1.3'],
        [group:'com.sun.media', name:'jai-codec', version:'1.1.3']
        )
    compile "net.java.dev.jai-imageio:jai-imageio-core-standalone:1.2-pre-dr-b04-2013-04-23" //this jar comes from the mygrid mavenRepo
}

plugins {
    build(":tomcat:$grailsVersion",
          ":release:1.0.0") {
        export = false
    }
    compile ":spring-security-core:1.2.7.3"
    compile ":wslite:0.7.2.0"
}

如果我使用 运行插件grails run-app,它可以很好地解决所有这些依赖项。只有当插件安装到项目中时,自动依赖解析才会失败。

我已经尝试使插件成为 maven 工件,并将其复制到我的本地存储库。在这些情况下,我flatDir从闭包中删除了该行repositories并将其替换为 mavenLocal()。同样,插件本身会安装,但指定的依赖项都不会安装。

我尝试将 BuildConfig.groovy 中的 legacyResolve 设置为 true,但这也无法安装 jars 或所需的插件(如 wslite)。

我什至尝试手动指定compile(":grails-my-plugin:0.1") {transitive: true},但它仍然无法解析插件。

在上述所有尝试之间,我卸载了我的插件,grails clean在项目上运行,删除了 ~/.grails/2.2.3/cached-installed-plugins/ 目录的内容,并在吟诵 Burt 的圣名时倒了酒Beckwith,但我仍然无法获得传递分辨率。

另一件值得注意的事情:我已经对项目运行了依赖关系报告。它在依赖项中列出了我的插件,但报告说插件本身没有依赖项。

我还运行了 refresh-dependencies myAppDeps.xml 以获得依赖关系报告。它不包含插件的任何依赖项,这些依赖项也不是 vanilla grails 项目的依赖项。

公共存储库中的 Grails 插件会自动解析其依赖项(例如,尝试将 spring-security-ldap 放入 BuildConfig.groovy 文件中,然后安装 spring-security-core)。传递分辨率根本不适用于本地插件吗?有什么方法可以让它工作,比如在 _Install.groovy 中添加一些东西?

更新

所以,我尝试了 dmahapatro 的建议。这确实有助于在项目中安装 myPlugin 所依赖的 jar;因此,项目编译并且依赖报告包含所需的 jar。但是,myPlugin 所依赖的插件仍然没有安装到我安装 myPlugin 的项目中。当我在成功编译后尝试运行应用程序时,我收到此错误:

| Error Error: The following plugins failed to load due to missing dependencies: [myPlugin]
- Plugin: myPlugin
   - Dependencies:
       - springSecurityCore (Required: 1.2 > *, Found: 1.2.7.3) 
       - jquery (Required: 1.7 > *, Found: 1.8.3) 
       ! wslite (Required: 0.7.2 > *, Found: Not Installed) [INVALID]

进一步更新

所以,我决定尝试隔离问题。我创建了一个新插件 ( grails create-plugin transitiveDep) 和一个新项目 ( grails create-app horseradish)。我将 BuildConfig.groovy 的相关部分从我的工作项目中复制到每个项目中,将插件依赖项从 my-plugin 更改为 transitive-dep。

瞧,辣根成功安装了所有需要的依赖项(wslite、springSecurityCore)。它甚至询问我是否想安装旧版本的 jQuery。

所以,我的环境没有任何问题。我怀疑此时插件的配置有其他问题。它最初是用 Grails 2.0.1 编写的,然后升级到 2.2.3。我也尝试将它安装到一个新的应用程序中,就像我安装了我的 transitive-dep 插件一样,但它仍然无法解决插件依赖项。当我弄清楚问题出在哪里时,我会发布更新。

最终更新

因此,阻止插件安装的原因是 myPlugin 在 application.properties 文件BuildConfig.groovy 中引用了它们。如果我在打包之前删除了对它们的引用,则插件安装得很好。

我还注意到我的PluginGrailsPlugin.groovy 文件中仍然有旧的Grails 版本(2.0),以及似乎不再需要的dependsOn 映射。我删除/更改了这些行,但直到清除 application.properties 中的旧引用,事情才真正开始工作。

值得注意的是,在对 myPlugin 进行更改后,我还必须清除我的 ~/.grails/2.2.3、~/.grails/ivy-cache 文件夹和 ~/.m2/repository/org/grails/plugins/ 目录,或者我的项目仍会尝试安装旧版本。我厌倦了这样做,我制作了一个 shell 脚本来做到这一点:

cd ~/.grails/2.2.3/
rm -r *
cd ~/.grails/ivy-cache/
rm -r *
cd ~/.m2/repository/org/grails/plugins/
rm -r *
4

3 回答 3

6

需要注意和纠正的重要操作(Wrt Grails 2.2.3):

  • 检查你的application.properties文件。application.properties 中不应有任何对已安装插件的引用。如果您一直在使用 安装插件install-plugin command(我现在不鼓励,因为它不再可用),它们很可能被写入该文件。删除任何引用已安装插件的行,然后再执行 agrails refresh-dependenciesgrails maven-install.

  • release将插件内的插件升级到v2.2.1

如果您使用的是最新版本的 grails,如下所示。

......
build(":tomcat:$grailsVersion",
          ":release:2.2.1") {
        export = false
}
.......
  • 当您grails maven-install在插件上执行此操作时,创建的结果 zip 将被命名为grails-my-plugin.zip插件项目名称MyPlugin,但是当您在 grails 应用程序中引用插件时(从 .m2 本地 repo 检索),您必须将插件引用为

    compile ':my-plugin:0.1' //instead of "grails-my-plugin"

观察:

  • 我在测试时遇到问题(与 svn 插件相关)使用(故意降级以复制您的问题),因此如果您使用 Grails 2.2.*release:1.0.0等,最好升级到版本2.2.1。您将无法除非您使用文档中提到的Grails 2.3 ,否则请使用 v3.0.0。

  • mygrid当我在测试时使用 repo 时,它没有抱怨任何事情。[ http://www.mygrid.org.uk/maven/repository]

  • 一旦my-plugin添加到我的应用程序中,我就能够编译我的应用程序,它安装了从my-plugin.

  • 依赖关系报告也显示了传递依赖关系。

在 Grails 2.2.3 中测试

于 2013-08-14T23:58:45.473 回答
0

在插件项目上运行 package-plugin。它将为您生成依赖文件。比你不应该得到这个依赖问题。

于 2013-08-14T19:22:28.930 回答
0

我有一个类似的应用程序没有检测到插件的传递依赖项的问题。我的插件的 grails 版本是 2.3.4,使用该插件的应用程序是 2.1.0。

该插件使用打包grails publish-plugin并手动上传到私有 Maven 兼容存储库(Artifactory)。

Grails 2.3.4 不会生成dependencies.groovy并且应用程序没有找出传递依赖关系并且编译失败。

正如@rittinger 在这篇文章中提到的那样,custom-plugin-dependencies-groovy-is-ignored pom 可以解决问题。当我手动将 plugin.zip 文件上传到 Artifactory 时,它生成了一个没有<dependencies/>部分的 pom 文件。

但是当我按照发布插件说明将插件上传到 Artifactory 时,生成的 pom 文件有<dependencies/>部分。之后,该应用程序在解决传递依赖项时没有任何问题。

于 2014-01-17T18:38:09.367 回答