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

Posted

技术标签:

【中文标题】BuildConfig.groovy Grails 2.2.3 中的自定义插件传递依赖解析【英文标题】:Custom Plugin transitive Dependency resolution in BuildConfig.groovy Grails 2.2.3 【发布时间】:2013-08-16 21:46:36 【问题描述】:

tl;dr 版本

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

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

加长版

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

如果将插件放入 BuildConfig.groovy 文件的 plugins 闭包中,不仅会自动安装插件,还会自动安装在其 BuildConfig.groovy 文件中为插件定义的所有依赖项(或者,在打包后,它的dependencies.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。在这些情况下,我从repositories 闭包中删除了flatDir 行,并将其替换为mavenLocal()。同样,插件本身会安装,但没有指定的依赖项。

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

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

在上述所有尝试之间,我卸载了我的插件,在项目上运行 grails clean,删除了 ~/.grails/2.2.3/cached-installed-plugins/ 目录的内容,并在念出伯特·贝克维斯的圣名,但我仍然无法获得及物解析。

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

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

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

更新

所以,我尝试了 dmahapatro 的建议。 确实 用于获取项目中安装 myPlugin 所依赖的 jar;因此,项目编译并且依赖报告包含所需的 jar。但是,myPlugin 所依赖的 plugins 仍未安装到我也安装 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 中的旧引用,事情才真正开始工作。

值得注意的是,在进行更改后,我还必须清除 ~/.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 *

【问题讨论】:

一边念诵圣名一边浇奠酒 - 喜欢。 :) 也许我不应该使用 Pabst... 你的应用和插件在同一台机器上运行吗? 是的,他们在同一台机器上。 对读到这里的任何人的一个偏离主题的公平警告:jai 依赖项只会在第二次运行刷新依赖项时解决。不知道为什么。使用 checksums false 禁用校验和检查并不能解决此问题。呃,好吧。这是另一天的另一个问题。 【参考方案1】:

需要注意和纠正的重要操作(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 时,如果插件项目名称为MyPlugin,则创建的结果zip 将命名为grails-my-plugin.zip,但是当您在grails 应用程序中引用该插件时(从.m2 本地检索repo),您必须将插件称为

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.0。

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

my-plugin 添加到我的应用程序后,我就能够编译我的应用程序,它安装了my-plugin 引用的spring 安全核心。

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

在 Grails 2.2.3 中测试

【讨论】:

这确实可以将插件依赖的 jar 文件(jai-core、jai-codec 和 jai-imageio-core-standalone)放入项目中。但是,请参阅我的最新更新。 @jonnybot 我的依赖报告快照也显示了my- plugin 中的插件。 奇数。您的 myPlugin 实际上在报告中显示了它的依赖关系。我的没有。 pbrd.co/1bzf78n bdmPlugin 是我的插件的实际名称。 :) jai jars 只是作为独立依赖项单独列出,即使它们肯定 not 在项目的 BuildConfig.groovy 中。 pbrd.co/1bzgfsLpbrd.co/1bzgrYY【参考方案2】:

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

【讨论】:

我真诚地希望这是真的,但事实并非如此。我已经运行 grails package-plugin 并安装了生成的 zip 文件。即使 zip 文件中包含的 dependencies.groovy 文件是正确的,但在将插件安装到应用程序中或在插件安装后运行应用程序时,依赖项不会自动解析。【参考方案3】:

我有一个类似的应用程序没有检测到插件的传递依赖项的问题。 我的插件grails版本是2.3.4,使用插件的app是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 文件。

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

【讨论】:

以上是关于BuildConfig.groovy Grails 2.2.3 中的自定义插件传递依赖解析的主要内容,如果未能解决你的问题,请参考以下文章

Grails项目BuildConfig.groovy Tomcat插件版本?

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

多个 Grails 插件和类路径

当 Grails BuildConfig 范围没有指定组织时会发生啥?

grails - 如何强制更新子依赖项

Groovy:使用 Grails 和 Spring 安全核心插件时出现意外令牌