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

标签 grails dependencies ivy grails-plugin grails-2.2

tl; dr版本

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

  • 将最新版本的发行版插件安装到您的插件中(解决了jar依赖项的问题)
  • 清除对BuildConfig.groovy文件中可能存在的插件的任何引用(解决了插件依赖性的问题)
  • grails maven-install使插件在mavenLocal()源
  • 中可用

    长版

    因此,我一直在尝试创建一个自定义的grails插件,供大学使用。

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

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

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

    在上述所有尝试之间,我卸载了插件,在项目上运行grails clean,删除了〜/ .grails / 2.2.3 / cached-installed-plugins /目录的内容,并注入(inject)了解放的名称,同时保留了圣洁的名称。伯特·贝克维斯(Burt Beckwith),但我仍然无法获得传递解决方案。

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

    我还运行了刷新依赖性myAppDeps.xml以获得依赖性报告。它不包含插件的依赖项,也不是vanilla grails项目的依赖项。

    公共(public)存储库中的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中引用了它们。如果我在打包之前删除了对它们的引用,那么插件安装就很好了。

    我还注意到,myPluginGrailsPlugin.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 *
    

    最佳答案

    需要注意和纠正的重要措施(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时,如果插件项目名称为grails-my-plugin.zip,则创建的最终zip文件将命名为MyPlugin,但是当您在grails应用程序中引用插件(从.m2本地存储库检索)时,则必须引用插件为
    compile ':my-plugin:0.1' //instead of "grails-my-plugin"

  • 观察值:
  • 我在测试时遇到了使用release:1.0.0(故意降级以复制您的问题)的问题(与svn插件有关),因此,如果您使用的是Grails 2.2。* 等,则最好升级到 2.2.1 版本。除非您使用文档中提到的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中测试

    关于grails - BuildConfig.groovy Grails 2.2.3中的自定义插件传递依赖项解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18240233/

    相关文章:

    构建我的 Play 应用程序时未找到 Hadoop 版本

    android - 在 Gradle 中设置 Ivy 本地存储库

    scala - sbt,publishLocal,解决错误

    database - 使用 grails 显示从数据库到 gsp(查看页面)的值

    ajax - chalice /AJAX : Updating an arbitrary region in the page using g:submitToRemote

    mongodb - 尝试使用GORM访问MongoDB数据时出现错误

    dependencies - Maven 神器 : x (managed from y)

    javascript - Angular 错误: Uncaught Error: [$injector:modulerr] Failed to instantiate module

    eclipse - 在哪里可以下载适用于 Windows 的 Groovy Grails Tool Suite 版本 3.5.1?

    java - 处理多模块 Maven 项目的依赖关系