BuildConfig.groovy Grails 2.2.3中的自定义插件可传递依赖项解析 tl;dr版本

BuildConfig.groovy Grails 2.2.3中的自定义插件可传递依赖项解析 tl;dr版本,grails,dependencies,ivy,grails-plugin,grails-2.2,Grails,Dependencies,Ivy,Grails Plugin,Grails 2.2,我的自定义grails插件的依赖项没有被我安装该插件的项目继承和解析 将最新版本的发布插件安装到插件中(修复jar依赖项的问题) 清除BuildConfig.groovy文件中可能存在的对插件的任何引用(修复了插件依赖项的问题) grailsmaven安装以使插件在mavenLocal()源代码中可用 长版本 所以,我一直在尝试创建一个定制的grails插件,供我的大学内部使用 如果将插件放在BuildConfig.groovy文件的plugins闭包中,不仅会自动安装插件,还会自动安装在B

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

  • 将最新版本的发布插件安装到插件中(修复jar依赖项的问题)
  • 清除BuildConfig.groovy文件中可能存在的对插件的任何引用(修复了插件依赖项的问题)
  • grailsmaven安装
    以使插件在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")
然后将其添加到插件闭包中:

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"
}
如果我使用
grailsrun-app
运行插件,它会很好地解决所有这些依赖关系。只有当插件安装到项目中时,自动依赖项解析才会失败

我试过了。在这些情况下,我从
存储库
闭包中删除了
flatDir
行,并将其替换为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的圣名时倒出了libation,但我仍然无法获得过渡解析

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

我还运行了refresh dependencies myAppDeps.xml以获取依赖关系报告。它不包含插件的依赖项,而这些依赖项也不是普通grails项目的依赖项

公共存储库中的Grails插件可以自动解析它们的依赖关系(例如,尝试将SpringSecurityLDAP放在BuildConfig.groovy文件中,SpringSecurityCore将安装)。传递解析对本地插件不起作用吗?有没有什么方法可以让它工作,比如在_Install.groovy中添加一些东西

更新
所以,我尝试了德马哈帕特罗的建议。这对在项目中安装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的相关部分从我的工作项目复制到每个项目中,将插件依赖关系从我的插件更改为transitive-dep

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

所以,我的环境没有问题。在这一点上,我怀疑插件的配置有其他问题。它最初是用Grails2.0.1编写的,然后升级到2.2.3。我也尝试过将它安装到一个新的应用程序中,就像我安装了我的可传递的dep插件一样,但使用它仍然无法解决插件依赖关系。当我弄清楚问题的确切位置后,我会发布更新

最后更新 因此,阻止插件安装的原因是myPlugin在application.properties文件以及BuildConfig.groovy中引用了它们。如果我在打包之前删除了对它们的引用,插件安装就可以了

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

值得注意的是,在更改myPlugin后,我还必须清除我的~/.grails/2.2.3、~/.grails/ivy缓存文件夹和~/.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 *

在插件项目上运行包插件。它将为您生成依赖项文件。因此,您不应该遇到这种依赖性问题。

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

  • 检查您的
    应用程序.properties
    文件在application.properties中不应该有任何对已安装插件的引用。如果您一直在使用
    install plugin命令安装插件(我现在不建议这样做,因为它将不再可用),那么它们很可能会被写入该文件。在执行
    g之前,删除所有引用已安装插件的行