自定义插件传递依赖解析在BuildConfig.groovy Grails 2.2.3< / h1 >



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

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

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

我真的很喜欢它,如果把插件在你的BuildConfig。groovy文件的plugins闭包不仅会自动安装插件,还会自动安装BuildConfig中为插件定义的所有依赖项。Groovy文件(或者,在打包之后,它的依赖项)。groovy文件)。

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

flatDir name:'my-plugin', dirs:'/Users/me/workspace-ggts/myplugin'

然后添加到plugins闭包:

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工件,并将其复制到我的本地存储库。在这些情况下,我从repositories闭包中删除了flatDir行,并用mavenLocal()代替了它。同样,插件本身会安装,但指定的依赖项都不会安装。

我试过在BuildConfig中设置legacyResolve。Groovy设置为true,但这也无法安装jar或所需的插件(如wslite)。

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

在以上所有尝试之间,我已经卸载了我的插件,在项目上运行grails clean,删除了~/.grails/2.2.3/cached-installed-plugins/目录的内容,并在吟唱Burt Beckwith的圣名时倒了酒,但我仍然无法获得传递分辨率。

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

我还运行refresh-dependencies myAppDeps.xml以获得依赖报告。它不包含任何不是普通grails项目依赖项的插件依赖项。

公共存储库中的Grails插件会自动解析它们的依赖项(尝试在BuildConfig中添加spring-security-ldap)。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- deep。

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

所以,我的环境没有问题。我怀疑在这一点上,其他东西是错误的插件的配置。它最初是用Grails 2.0.1编写的,后来升级到2.2.3。我也试过将它安装到一个新的应用程序中,就像我做我的transitive- deep插件一样,但它仍然无法解决插件依赖关系。当我弄清楚问题的确切位置后,我会发布更新。

最终更新

所以,阻止插件安装的原因是myPlugin在应用程序中引用了它们。属性文件以及BuildConfig.groovy。如果我在打包之前删除了对它们的引用,插件就会安装得很好。

我还注意到我的myPluginGrailsPlugin中仍然有旧的Grails版本(2.0)。groovy文件,以及一个似乎不再需要的dependsOn映射。我删除/修改了这些行,但直到清除了应用程序中的旧参考。

值得注意的是,我还必须清除我的~/.grails/2.2.3, ~/。Grails/ivy-cache文件夹和~/。在对myPlugin进行更改后,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):

  • 检查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是一个更好的主意如果你使用的是Grails2.2.*等。除非使用Grails2.3,否则无法使用v3.0.0。如文件所述。

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

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

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

在Grails 2.2.3中测试

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

我有一个类似的问题,应用程序没有检测到来自插件的可传递依赖。我的插件的grails版本是2.3.4,使用这个插件的应用程序是2.1.0。

插件使用grails publish-plugin打包,并手动上传到私有的Maven兼容存储库(Artifactory)。

Grails 2.3.4不生成依赖项。Groovy和应用程序没有找出传递依赖关系,导致编译失败。

正如@rittinger在这篇文章中提到的,custom-plugin-dependencies-groovy-is-ignored - pom做到了这一点。当我手动将plugin.zip文件上传到Artifactory时,它生成了一个没有<dependencies/>部分的pom文件。

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

最新更新