34

我正在编写一个 Gradle 插件,但无法让apply plugin:命令在使用该插件的 Gradle 脚本中工作。我正在使用 Gradle 1.1。

我已经用它构建了插件,clean build我现在正试图通过一个平面 repo 将它添加到 Gradle 构建中。这似乎有效,但 Gradle 没有发现有 ID 的插件test-plugin。插件中的项目名settings.gradleistest-plugin和属性文件中META-INF/gradle-plugins的也是test-plugin.properties. 我不确定在哪里可以指定插件 ID。

build.gradle项目中使用的文件test-plugin

repositories {
  flatDir name: 'libs', dirs: "../build/libs"
}

dependencies {
  compile 'test:test-plugin:0.1'
}

apply plugin: 'test-plugin'

来自 Gradle 的错误:

What went wrong:
A problem occurred evaluating root project 'tmp'.
Plugin with id 'test-plugin' not found.
4

6 回答 6

26

插件 Jar 必须作为构建脚本依赖项添加:

buildscript {
    repositories { flatDir name: 'libs', dirs: "../build/libs" }
    dependencies { classpath 'test:test-plugin:0.1' }
}

apply plugin: "test-plugin"
于 2012-09-24T17:33:36.017 回答
9

如果你想在你的构建脚本中实现一个插件,那么你有两个选择。

选项1
apply plugin: YourCustomPluginClassName

选项 2

plugins {
    id 'your.custom.plugin.id'
}

apply plugin:在通过类名指定插件时使用(例如apply plugin: JavaPlugin
plugins { }在通过 id 指定插件时使用(例如plugins { id 'java' }
参见教程点的 Gradle 插件以获取参考

如果您选择选项 1,您的自定义插件将需要通过 3 种方式中的一种方式引入您的构建脚本。

  1. 您可以直接在 Gradle 构建脚本中对其进行编码。
  2. 您可以将其放在buildSrc下(例如buildSrc/src/main/groovy/MyCustomPlugin)。
  3. 您可以在buildscript方法中将自定义插件作为 jar 导入。有关该方法的信息,
    请参阅Haki 先生的 Gradle Goodness 。buildscript

如果您选择选项 2,那么您需要创建一个插件 ID。创建以下文件buildSrc/src/main/resources/META-INF/gradle-plugins/[desired.plugin.id].properties

复制并粘贴implementation-class=package.namespace.YourCustomPluginClassName到新创建的.properties文件中。替换package.namespace.YourCustomPluginClassName为所需插件类的完全限定类名。

有关更多信息,请参阅Gradle 的自定义插件。

于 2018-11-23T20:43:18.043 回答
2

我也遇到了同样的问题,没有找到自定义插件 ID。就我而言,我只是忘记添加“src/main/resources/META-INF/gradle-plugins”属性文件。属性文件的名称必须与带有“.properties”扩展名的插件 ID 的名称相匹配。

该文件必须包含以下行:

implementation-class=(your fully qualified plugin classpath)

这就是插件 id 如何解析为类名的完整机制。

此外,插件需要添加为上一个答案中指出的依赖项。android 文档声明您应该使用与您的唯一域名相关联的名称。即:'test-plugin' 这个名字并不是很好的形式,但是像 'com.foo.gradle.test-plugin' 这样的 id 会更好。

于 2018-03-27T19:11:56.193 回答
1

确保您的顶层build.gradle使用正确classpath的来引用构建*.jar文件的路径。

一些插件,比如maven-publish,会构建 jar 并将其保存到 中的特定位置mavenLocal,但路径可能看不清楚。

您应该查看 jar 文件的文件路径,并确保它与您的. 匹配classpath,但映射不是很明显:

buildscript {
  dependencies {
    // This *MUST* match the local file path of the jar file in mavenLocal, which is:
    // ~/.m2/repository/com/company/product/plugin/product-gradle-plugin/1.0/product-gradle-plugin-1.0.jar
    classpath 'com.company.product.plugin:product-gradle-plugin:1.0'
  }
}

注意不要使用错误的类路径,它可以引用一个目录而不是实际的 jar 文件;像这样:

buildscript {
  dependencies {
    // This is wrong, because it refers to the mavenLocal FOLDER "product-gradle-plugin",
    // instead of the jar FILE "product-gradle-plugin-1.0.jar"
    // However, a gradle sync will still resolve it as a valid classpath!!
    classpath 'com.company.product:product-gradle-plugin:1.0'
  }
}

更多信息:

于 2020-01-30T16:53:26.743 回答
0

除了@Bonifacio2 写的内容之外,这是一条路径META-INF/gradle-plugins,并在 IntelliJ 中显示为META-INF.gradle-plugins. 不惜一切代价不要犯我直接将其创建为目录的愚蠢错误,META-INF.gradle-plugins因为您基于另一个示例,并且永远不会工作。另一个技巧是也从另一个 intelliJ 项目复制,因为这是添加的:gradle-plugins.

于 2020-04-17T01:09:38.577 回答
0

嗯,也许试试;

    configure <org.jsonschema2pojo.gradle.JsonSchemaExtension> {
     this.sourceFiles = files("${project.rootDir}/schemas")
    }
于 2020-05-06T22:37:16.067 回答