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

标签 java gradle build.gradle gradle-plugin

我正在尝试为自定义 gradle 插件构建一个 jar,以供其他 gradle 项目使用。我正在使用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'

在项目上应用插件时,我收到 Guava 类的 NoClassDefFound 异常。如果我在 build.gradle

中包含一个创建具有如下依赖项的 jar 的任务
jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it)}
    }
}

它显示未找到 ID 为“my-plugin”的插件。如何在 gradle 插件 jar 中包含依赖项?

最佳答案

您的插件项目应配置为独立的插件项目,然后发布到 Maven 存储库,这将使依赖项解析工作;有关于编写自定义插件的很好的文档 here ,特别是以下部分:using Gradle plugin development plugin

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

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

插件项目

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

插件实现: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 存储库

消费者项目

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

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

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

关于java - 带有依赖项的 Gradle 自定义插件 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53196731/

相关文章:

java - AspectJ 指向特定方法中方法调用的切入点

java - 从Java中的文本文件中读取特定行

android - Espresso-web 导入导致 duplicateFileException

gradle - Sonar 不获取测试覆盖率信息

java - 如何给java足够的时间给变量赋值?

java - 如何在Java中检测主线程何时卡住GUI?

maven - Gradle 子项目依赖管理,就像在 Maven 中一样

java - 在 IntelliJ 中设置 Gradle 任务 `bootrun`

android - 为什么用户运行 gradlew 的位置会影响输出?

Android Studio 构建超时