我正在尝试为自定义gradle插件构建一个jar,以供其他gradle项目使用。我正在用Java编写插件。我遇到了一个问题,包括jar中的依赖项。如果我使用下面的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'
在将插件应用于项目时,我得到了番石榴类的NoClassDefFound异常。如果我在build.gradle
jar {
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it)}
}
}
上面写着Plugin with Id 'my-plugin' not found
。如何在gradle插件jar中包含依赖项?
答案 0 :(得分:1)
您的插件项目应配置为独立的插件项目,然后发布到maven存储库,这将使依赖项解析有效;有很多有关编写自定义插件here的文档,特别是以下部分:using Gradle plugin development plugin
这里的Gradle示例中还有一个很好的示例,用于编写/发布/使用自定义插件:https://github.com/gradle/gradle/tree/master/subprojects/docs/src/samples/plugins(请参见两个子项目publishing
和consuming
)
这是一个带有插件的有效示例,该插件依赖于外部库(例如,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
消费项目
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
答案 1 :(得分:0)
很抱歉将其添加为答案,但我没有足够的要点发表评论(是的,虽然来得有点晚,但我在搜索中发现了这一点,而且非常接近,也许会对其他人有所帮助)。
@ M.Ricciuti的答案是正确的,只是缺少一个文件,即引用项目(不是插件)目录中的settings.gradle:
pluginManagement {
repositories {
maven {
url '../repos/maven-repo'
}
gradlePluginPortal()
ivy {
url '../repos/ivy-repo'
}
}
}
非常感谢,在找到这个东西之前,我已经尝试了许多不起作用的东西,即使gradle的示例也不起作用(或者更有可能是我没有正确运行它们)。无论如何,我将答案中看到的与Ricciuti先生的答案合并,并在示例中看到了该文件。
我的完整项目在https://github.com/reddierocket/sampleGradlePlugin 自述文件中有运行它的说明。 (请注意,我没有包含包装器,但我使用的是Gradle版本5.3.1。)