Java 向Gradle项目添加本地插件

Java 向Gradle项目添加本地插件,java,gradle,Java,Gradle,我有一个Gradle插件,可以按照预期编译和工作。我想与源代码一起发布一个使用Gradle插件的示例应用程序,它还允许我轻松测试对插件的更改。现在要做到这一点,我必须向buildScript块添加类路径依赖项。是否可以添加将与示例项目一起编译的依赖本地插件?我现在遇到的主要问题是,在尝试同步示例项目时插件不存在,导致失败。如果编写集成测试是您的最终目标,我仍然建议使用ProjectBuilder。您可以在中看到这方面的示例。gradle source中有更多的实际测试实现示例 话虽如此,我对你

我有一个Gradle插件,可以按照预期编译和工作。我想与源代码一起发布一个使用Gradle插件的示例应用程序,它还允许我轻松测试对插件的更改。现在要做到这一点,我必须向
buildScript
块添加类路径依赖项。是否可以添加将与示例项目一起编译的依赖本地插件?我现在遇到的主要问题是,在尝试同步示例项目时插件不存在,导致失败。

如果编写集成测试是您的最终目标,我仍然建议使用ProjectBuilder。您可以在中看到这方面的示例。gradle source中有更多的实际测试实现示例


话虽如此,我对你贴出的文字问题感到好奇,并尝试了一些事情。对我来说,成功的原因是:

buildscript{
    repositories{
        ...
    }

    dependencies{
        classpath files('relative/path/to/plugin.jar')
    }
}

apply plugin: fully.qualified.package.PluginClassName
请注意,类名未包含在
'
引号
'
中以使其成为字符串

这不是很有用,因为此声明要求在构建使用插件的项目之前构建并可用
plugin.jar
——但此时,您可能还需要依赖外部回购依赖关系

第二个问题是插件项目的可传递依赖项不会自动添加到插件消费者项目中

我无法在buildscript中使用像
classpath项目(':plugin项目')
这样的项目依赖项



在构建插件消费者项目时,确保插件项目始终处于构建状态且可用的一种方法是使用“父”build.gradle,它总是在构建消费者项目之前先构建插件。I.

对于当前的Gradle版本(在撰写本文时为3.3版),您可以使用复合构建功能替换插件依赖项

例如,可以使用以下命令(在示例项目的根目录下运行)构建示例项目:
gradlebuild——包括build/path/to/local插件

这将从您的本地目录中获取您的插件。它甚至会先构建您的插件,然后使用刚刚构建的插件作为依赖项构建您的示例项目

IDE也支持此功能:

请参见此处的文档:


请注意,替换插件只适用于buildscript块,而不适用于plugins块。

当我想在Android Studio中调试我的
gradle插件时,我最终解决了它

首先,将你的
gradle插件上传到本地maven

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile gradleApi()
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"


group='com.egos.gradle.plugins'
name='plugintest'
version='0.0.1'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}
执行
gradleuploadarchives
。然后使用本地插件

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'com.egos.gradle.plugins',
                  name: 'plugintest',
                  version: '0.0.1'
    }
}

apply plugin: 'com.egos'

对上述答案的补充。您还需要添加“gradlePlugin”和“uploadArchives”,如下所示:

gradlePlugin {
    plugins {
        testgen {
            id = "com.egos.gradle.plugins"
            implementationClass = "com.egos.gradle.plugins.<PluginClassName>"
        }
    }
}
gradlePlugin{
插件{
testgen{
id=“com.egos.gradle.plugins”
implementationClass=“com.egos.gradle.plugins。”
}
}
}
而不是设置你的插件类名。
其余部分与上述答案相同。谢谢

正如多伦所注意到的,他找到了一种干净的方法来处理复合构建。以下是步骤:

  • 使用
    组的
    build.gradle
    定义插件:
  • 设置中引用您的项目。gradle
    如下所示:
  • 在您的项目中,您可以通过以下方式使用插件:

请注意,类路径是如何由插件的gradle文件中定义的组及其目录名组成的。

这是演示如何使用插件的示例项目,还是插件的一种集成测试?如果是前者,为什么不依赖于jcenter或gradle插件门户repo的插件呢?为什么它必须依赖于本地插件项目?如果它是一个集成测试,你真的应该这样做嗯,我想它可能只是一个集成测试,这就是我最终要完成的。我会查看这个ProjectBuilder并报告它的运行情况,谢谢。@Bobbake4你有没有找到一个好方法来做这件事?这是我在网上找到的第一个好答案,但是在检查其他配置之前,你能解释一下如何构建插件吗?看看我的问题,当我在根目录中添加一个单独的任务
buildPluginProject
时,它仍然会检查插件是否是在其他目录中构建的configs@Ben自从两年多前我写了我的示例项目以来,我还没有尝试过构建它,你能展示一下你的buildPluginProject任务吗?谢谢你的好奇和花时间研究这个答案。这节省了我几个小时。为此,我们应该添加
apply plugin:'java gradle plugin'
plugins{id'java gradle plugin'}
我需要您提供有关彩信操作的帮助,请连接
// some-plugin/build.gradle
...
group = "some.group.id"
...
// settings.gradle
...
includeBuild 'some-plugin'
// some-project/build.gradle
buildscript {
  dependencies {
    classpath "some.group.id:some-plugin"
  }
}

apply(plugin: "your.plugin.id")