BuildConfig.groovy Grails 2.2.3中的自定义插件传递依赖性解析

时间:2013-08-14 19:09:10

标签: grails dependencies ivy grails-plugin grails-2.2

tl; dr version

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

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

长版

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

如果将插件放入BuildConfig.groovy文件的插件关闭中,我会非常喜欢它,不仅会自动安装插件,还会在BuildConfig.groovy文件中为插件定义所有依赖项(或者,在打包之后,依赖于.groovy文件)。

查看the instructions,我已经在存储库关闭中为我的项目设置了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运行插件,它会很好地解决所有这些依赖项。仅当插件安装到自动依赖项解析失败的项目时才会这样。

我已经尝试making the plugin a maven artifact, and copying it to my local repository了。在这些情况下,我从flatDir闭包中删除了repositories行,并将其替换为mavenLocal()。同样,插件本身安装,但没有指定的依赖项。

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

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

在上述所有尝试中,我已经卸载了我的插件,在项目上运行grails clean,删除了〜/ .grails / 2.2.3 / cached-installed-plugins /目录的内容,在吟诵Burt Beckwith的圣名时倾吐了奠基,但我仍然无法获得传递性解析。

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

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

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

更新

所以,我尝试了dmahapatro的建议。那个 用于获取myPlugin在项目中安装的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中引用了它们。如果我在打包之前删除了对它们的引用,那么插件安装就好了。

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

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

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

3 个答案:

答案 0 :(得分:6)

需要注意和纠正的重要行动(w.r.t Grails 2.2.3):

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

  • 将插件中的release插件升级为v2.2.1

如果你使用的是最新版本的grails,请按照下面的说法进行操作。

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

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

观察:

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

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

  • my-plugin添加到我的应用程序后,我就可以编译我的应用程序,它安装了my-plugin引用的Spring安全核心。

  • Dependency report也显示了传递依赖关系。

在Grails 2.2.3中进行了测试

答案 1 :(得分:0)

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

答案 2 :(得分: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中所提到的那样。当我手动将plugin.zip文件上传到Artifactory时,它生成了一个没有<dependencies/>部分的pom文件。

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