Gradle custom plugin jar with dependencies

末鹿安然 提交于 2020-05-29 10:59:07

问题


I'm trying to build a jar for a custom gradle plugin to be used by other gradle projects. I'm using java to write the plugin. I'm having a problem including dependencies in my jar. If I build the jar using the below build.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'

I get a NoClassDefFound exception for guava classes when applying the plugin on a project. If I include a task to create a jar with dependencies like below in the build.gradle

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

It says Plugin with Id 'my-plugin' not found. How do I include dependencies in a gradle plugin jar?


回答1:


Your plugin project should be configured as a standalone Plugin project and then published to a maven repository, which will make dependencies resolution work; there is good documentation about writing custom plugin here, specially the following part : using Gradle plugin development plugin

There is also a good example of writing/publishing/consuming a custom Plugin in the Gradle examples here : https://github.com/gradle/gradle/tree/master/subprojects/docs/src/samples/plugins (see the two subprojects publishing and consuming )

And here is a working example with a plugin that has dependency on external library (commons-lang for example):

Plugin project

build.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'
}

Plugin implementation : 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")
            }
        }
    }
}

Build and publish this plugin ./gradlew publish : the plugin jar and "plugin marker artefacts" will be published to local maven repo in ../repos/maven-repo

Consumer project

build.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()
}

To test the plugin, try to execute the plugin task testPlugin

> Task :testPlugin
 custom plugin task executing. 
 Result: Stringtotest



回答2:


Sorry to add this as an answer but I don't have enough points to comment (yes it is a bit late in coming but I found this in a search and it came so close, maybe this will help someone else).

The answer by @M.Ricciuti is correct, just missing one file, namely a settings.gradle in the referencing project (not the plugin) directory:

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

}

Many thanks, I have tried many things that didn't work before finding this, even the examples by gradle didn't work (or more likely I didn't run them correctly). Anyway I merged what I saw in the answers with M. Ricciuti's answer and saw that file in the sample.

My complete project is at https://github.com/reddierocket/sampleGradlePlugin The readme has instructions to run it. (Note I did not include the wrapper but I am using gradle version 5.3.1.)



来源:https://stackoverflow.com/questions/53196731/gradle-custom-plugin-jar-with-dependencies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!