当前位置: 首页 > 知识库问答 >
问题:

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

梁丘俊材
2023-03-14
    null

如果将插件放在buildconfig.groovy文件的plugins闭包中,不仅会自动安装插件,还会自动安装在其buildconfig.groovy文件中为插件定义的所有依赖项(或者打包后,安装其dependencies.groovy文件),我真的希望如此。

查看说明,我已经在repositories闭包中为我的项目设置了buildconfig.groovy文件:

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

然后将此添加到插件闭包中:

compile(":grails-my-plugin:0.1")
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.groovy中的legacyResolve设置为true,但这也无法安装JAR或所需的插件(如wslite)。

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

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

我还运行了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。

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

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

因此,阻止插件安装的原因是myPlugin在application.properties文件和buildconfig.groovy中引用了它们。如果我在打包之前删除了对它们的引用,那么插件安装得很好。

我还注意到我在myPlugingGrailsplugin.groovy文件中仍然有旧的Grails版本(2.0),以及一个似乎不再需要的依赖映射。我删除/修改了这些行,但直到清除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 *

共有1个答案

罗翔
2023-03-14

需要注意和纠正的重要操作(W.R.T Grails 2.2.3):

>

  • 检查application.properties文件。在application.properties中不应该有任何对已安装插件的引用。如果您使用install-plugin command安装插件(我现在不鼓励使用它,因为它将不再可用),那么它们很可能被写入该文件。在执行Grails refresh-dependenciesGrails maven-install之前,删除引用已安装插件的所有行。

    将插件中的releaseplugin升级到v2.2.1

    ......
    build(":tomcat:$grailsVersion",
              ":release:2.2.1") {
            export = false
    }
    .......
    

    编译':my-plugin:0.1'//而不是“grails-my-plugin”

    观察:

    >

  • 在测试时,我使用release:1.0.0(故意降级以复制您的问题)时遇到了问题(与svn插件有关),因此,如果您使用的是Grails 2.2.*等,最好升级到版本2.2.1。除非您使用文档中提到的Grails 2.3,否则您将无法使用V3.0.0。

    my-plugin添加到我的应用程序中后,我就能够在安装了my-plugin中引用的spring security core的地方编译我的应用程序。

    依赖项报告也显示了传递依赖项。

    在Grails 2.2.3中测试

  •  类似资料:
    • 如何编写自定义gradle插件来处理自定义存储库中自定义模块描述符中的依赖关系?gradle文档说了以下内容,但我还没有找到任何可以告诉我如何操作的内容。 即使您的项目使用的是自定义依赖关系管理系统或类似Eclipse的东西。类路径文件作为依赖关系管理的主数据,编写Gradle插件以在Gradle中使用此数据非常容易。 我一直在为ATG项目维护一个定制的常春藤解析器(源自此项目),但Gradle最

    • 我试图为其他gradle项目使用的自定义gradle插件构建一个jar。我使用java编写插件。我有一个问题,包括我的jar中的依赖项。如果我使用下面的代码构建jarbuild.gradle 在一个项目中应用插件时,我得到了一个针对guava类的NoClassDefFound异常。如果我在 它表示未找到Id为“my Plugin”的。如何在gradle插件jar中包含依赖项?

    • 我有一个奇怪的问题,< code > mvn clean install-d project . version = 1 或< code>jenkins build运行正常,但当我在IDE中打开模块时,intellij变得非常愤怒,这影响了开发。 我在intellij日志中看到以下问题 POM 代码受版权保护,所以不能透露,但这是一个基本大纲 < li>fabric-common:基本模块(用于绑

    • 我正在从一个使用Android-Maven-Plugin的Maven项目中构建一个Android应用程序。在这个项目中,我使用了新的beta版数据绑定库。 它包含在Android SDK的本地m2repository中(extras/Android/m2repository)。这个存储库中的库打包为AAR类型。 附注:对于我自己的本地构建,我有几个解决方案(例如重新打包为jar),但我更喜欢一个更

    • 问题内容: 我在ivaven.xml中添加了一个依赖项(让我们将其命名为A),它在maven Central中具有一个pom文件。Ivy使用ibiblio解决了Maven依赖关系。添加到ivy.xml的依赖项(A)具有传递的依赖项(B)。到目前为止,到目前为止很好。常春藤无法解决传递性依赖项(B)的依赖项(C)。 我在ivy.xml中定义了A,如下所示: 在B的pom文件中,在编译和测试范围中都定