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-dependencies
和grails 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 中的自定义插件传递依赖解析