繁体   English   中英

带有依赖项的 Gradle 自定义插件 jar

[英]Gradle custom plugin jar with dependencies

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

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'

在项目上应用插件时,我收到番石榴类的 NoClassDefFound 异常。 如果我在build.gradle包含一个任务来创建一个具有如下依赖项的 jar

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

它说Plugin with Id 'my-plugin' not found 如何在 gradle 插件 jar 中包含依赖项?

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

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

这是一个工作示例,它的插件依赖于外部库(例如,commons-lang):

插件项目

构建.gradle

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/sample/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 publish :插件 jar 和“插件标记人工制品”将发布到../repos/maven-repo 中的本地 maven repo

消费者项目

构建.gradle

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

很抱歉将其添加为答案,但我没有足够的观点来评论(是的,它来的有点晚了,但我在搜索中发现了这个,它非常接近,也许这会对其他人有所帮助)。

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

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

}

非常感谢,在找到这个之前我已经尝试了很多不起作用的东西,甚至 gradle 的例子也不起作用(或者更有可能是我没有正确运行它们)。 无论如何,我将我在答案中看到的内容与 M. Ricciuti 的答案合并,并在样本中看到了该文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM