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

jon*_*bot 3 grails dependencies ivy grails-plugin grails-2.2

tl;博士版

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

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

长版

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

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

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

flatDir name:'my-plugin', dirs:'/Users/me/workspace-ggts/myplugin'
Run Code Online (Sandbox Code Playgroud)

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

compile(":grails-my-plugin:0.1")
Run Code Online (Sandbox Code Playgroud)

这确实正确安装了插件,但它没有解决任何插件的依赖项或所需的插件.这是插件的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"
}
Run Code Online (Sandbox Code Playgroud)

如果我使用插件运行grails run-app,它会解决所有这些依赖关系.只有当插件安装到项目时,自动依赖项解析才会失败.

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

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

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

在上述所有尝试之间,我已经卸载了我的插件,grails clean在项目上运行,删除了〜/ .grails/2.2.3/cached-installed-plugins /目录的内容,并在吟唱伯特的圣名时倾倒了libation Beckwith,但我仍然无法获得传递解析.

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

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

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

更新

所以,我尝试了dmahapatro的建议.这确实有助于在项目中安装myPlugin所依赖的罐子; 因此,项目编译并且依赖性报告包含所需的罐子.但是,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]
Run Code Online (Sandbox Code Playgroud)

进一步更新

所以,我决定试图找出问题所在.我创建了一个全新的插件(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中的旧引用才真正开始工作.

值得注意的是,在更改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 *
Run Code Online (Sandbox Code Playgroud)

dma*_*tro 6

需要注意和纠正的重要行动(WTS Grails 2.2.3):

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

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

如果你使用最新版本的grails,如下所示.

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

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

观察:

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

  • 当我mygrid在测试时使用回购时它没有抱怨任何东西.[ http://www.mygrid.org.uk/maven/repository]

  • 一旦my-plugin添加到我的应用程序,我就能够编译我的应用程序,它安装了弹簧安全核心my-plugin.

  • 依赖性报告也显示了传递依赖性.

在Grails 2.2.3中测试