tl;博士版
我的自定义 grails 插件的依赖项没有被我安装插件的项目继承和解决。
- 将最新版本的发布插件安装到您的插件(修复 jar 依赖项的问题)
- 清除对您的 BuildConfig.groovy 文件中可能存在的插件的任何引用(修复插件依赖项的问题)
grails maven-install
使插件在 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")
这确实正确安装了插件,但它不能解决任何插件的依赖项或所需的插件。这是插件的 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
,它可以很好地解决所有这些依赖项。只有当插件安装到项目中时,自动依赖解析才会失败。
我已经尝试使插件成为 maven 工件,并将其复制到我的本地存储库。在这些情况下,我flatDir
从闭包中删除了该行repositories
并将其替换为 mavenLocal()。同样,插件本身会安装,但指定的依赖项都不会安装。
我尝试将 BuildConfig.groovy 中的 legacyResolve 设置为 true,但这也无法安装 jars 或所需的插件(如 wslite)。
我什至尝试手动指定compile(":grails-my-plugin:0.1") {transitive: true}
,但它仍然无法解析插件。
在上述所有尝试之间,我卸载了我的插件,grails clean
在项目上运行,删除了 ~/.grails/2.2.3/cached-installed-plugins/ 目录的内容,并在吟诵 Burt 的圣名时倒了酒Beckwith,但我仍然无法获得传递分辨率。
另一件值得注意的事情:我已经对项目运行了依赖关系报告。它在依赖项中列出了我的插件,但报告说插件本身没有依赖项。
我还运行了 refresh-dependencies myAppDeps.xml 以获得依赖关系报告。它不包含插件的任何依赖项,这些依赖项也不是 vanilla grails 项目的依赖项。
公共存储库中的 Grails 插件会自动解析其依赖项(例如,尝试将 spring-security-ldap 放入 BuildConfig.groovy 文件中,然后安装 spring-security-core)。传递分辨率根本不适用于本地插件吗?有什么方法可以让它工作,比如在 _Install.groovy 中添加一些东西?
更新
所以,我尝试了 dmahapatro 的建议。这确实有助于在项目中安装 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 的相关部分从我的工作项目中复制到每个项目中,将插件依赖项从 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 中的旧引用,事情才真正开始工作。
值得注意的是,在对 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 *