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

Gradle自定义插件罐与依赖关系

龚志
2023-03-14

我试图为其他gradle项目使用的自定义gradle插件构建一个jar。我使用java编写插件。我有一个问题,包括我的jar中的依赖项。如果我使用下面的代码构建jarbuild.gradle

plugins {
    id 'groovy'
}

repositories{
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile localGroovy()
    compile 'com.google.guava:guava:27.0-jre'
    testCompile 'junit:junit:4.12'
    //compile 'org.apache.commons:commons-lang3:3.8.1'
}

group = 'com.mine'
version = '1.0'

在一个项目中应用插件时,我得到了一个针对guava类的NoClassDefFound异常。如果我在构建中包含一个任务来创建一个依赖项如下的jar。格雷德尔

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it)}
    }
}

它表示未找到Id为“my Plugin”的插件。如何在gradle插件jar中包含依赖项?

共有2个答案

胡高寒
2023-03-14

很抱歉添加这个作为答案,但我没有足够的分数来评论(是的,这是有点晚了,但我在搜索中发现了这个,它来得太近了,也许这会帮助其他人)。

@M.Ricciuti的答案是正确的,只是缺少一个文件,即设置。引用项目(而非插件)目录中的gradle:

pluginManagement {
    repositories {
        maven {
            url '../repos/maven-repo'
        }
        gradlePluginPortal()
        ivy {
            url '../repos/ivy-repo'
    }
}

}

非常感谢,在找到这一点之前,我已经尝试了很多不起作用的东西,甚至gradle的例子也不起作用(或者更可能的是,我没有正确地运行它们)。不管怎样,我把我在答案中看到的东西和M.Ricciuti的答案结合起来,在样本中看到了那个文件。

我的整个项目在https://github.com/reddierocket/sampleGradlePlugin自述文件中有运行它的说明。(注意,我没有包括包装器,但我使用的是gradle 5.3.1版。)

谈桐
2023-03-14

你的插件项目应该被配置为一个独立的插件项目,然后发布到maven存储库,这将使依赖项解析工作;这里有关于编写自定义插件的好文档,特别是以下部分:使用Gradle插件开发插件

这里还有一个在Gradle示例中编写/发布/使用自定义插件的好例子:https://github.com/gradle/gradle/tree/master/subprojects/docs/src/samples/plugins(请参阅两个子项目发布使用

下面是一个插件的工作示例,该插件依赖于外部库(例如commons lang):

插件项目

建筑格拉德尔

plugins {
    id 'java-gradle-plugin'
    id 'groovy'
    id 'maven-publish'
}
group 'org.gradle.sample.plugin'
version '0.1'

//  pugin metadata configuration
gradlePlugin {
    plugins {
        myplugin {
            id = "org.gradle.sample.plugin.myplugin"
            implementationClass = "org.gradle.sample.plugin.MyPlugin"
        }
    }
}
// publish to local maven repo for testing
publishing {
    repositories {
        maven {
            url "../repos/maven-repo"
        }
    }
}
//  repo for dependences resolution
repositories{
    jcenter()
}

// dependencies of this plugin 
dependencies {
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
}

插件实现:src/main/groovy/org/gradle/samp/plugin/MyPLugin.groovy

package org.gradle.sample.plugin

import org.apache.commons.lang3.StringUtils
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin implements Plugin<Project> {
    @Override
    void apply(final Project project) {
        println "Applying custom plugin... "
        project.tasks.create('testPlugin'){
            doLast{
                println " custom plugin task executing."
                println "Result: " + StringUtils.capitalize("stringtotest")
            }
        }
    }
}

构建并发布此插件./gradlew发布:插件jar和插件标记人工制品将发布到本地maven repo in.../repos/maven-repo

消费者项目

建筑格拉德尔

plugins {
    id 'java'
    // import/apply your custom plugin
    id 'org.gradle.sample.plugin.myplugin' version '0.1'
}

group 'org.gradle.sample.plugin'
version '0.1'

repositories{
    maven {
        url "../repos/maven-repo"
     }
    jcenter()
}

要测试插件,请尝试执行插件任务testPlugin

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

  • 在另一个项目中,我使用/应用这个插件: 但是如何从MyGradlePlugin.groovy中的apply方法中迭代公共依赖项并打印它们的坐标(artifactId、groupId、version)?

  • 我正在写一些gradle插件,现在我遇到了一个问题,DriverManager看不到buildscript依赖项中定义的JDBC驱动程序: 我有下一个build.gradle文件: 当我调用扩展DefaultTask的任务中定义的命令时

  • null 如果将插件放在buildconfig.groovy文件的plugins闭包中,不仅会自动安装插件,还会自动安装在其buildconfig.groovy文件中为插件定义的所有依赖项(或者打包后,安装其dependencies.groovy文件),我真的希望如此。 查看说明,我已经在repositories闭包中为我的项目设置了buildconfig.groovy文件: 然后将此添加到插件闭

  • 我使用的是与Android Studio捆绑的Gradle构建系统。到目前为止,我能够使用存储在项目结构中的依赖关系构建多项目设置。我现在想使用maven依赖,但没有用。我写了一个非常简单的构建。总是失败的gradle文件: 显示以下消息: 到目前为止,我尝试过的任何产品都会发生这种情况。你知道怎么了吗? 谢谢