首页 > 解决方案 > 构建 gradle 插件

问题描述

我正在与一个项目一起开发一个 gradle 插件:

plugin_consumer
  |
  + build.gradle
  + src/

plugin
  |
  + build.gradle 
  + libs/
  + src/

所有 jar 都plugin/libs在构建后移动到,plugin consumer模块使用插件,如下所示:

buildscript {
  repositories {
  // ...
  }
  dependencies {
    classpath fileTree(dir:'../plugin/libs', include: ['*.jar'])
  }
} 

apply plugin: 'my.custom.plugin'

我进行了测试,这个设置运行良好,但是插件.jar是在没有依赖项的情况下构建的,一旦我向项目添加一些依赖项,消费者 buildscript 就会因为NoClassDefFoundError异常而开始崩溃。问题是当我构建一个胖罐子而不是脚本不再找到插件时:

// from plugin/build.gradle 
// Configurations to build jar with dependencies
configurations {
  jar.archiveName = 'plugin.jar'
}
jar {
  archiveName = 'plugin.jar'
  baseName = project.name + '-all'
  from { configurations.compile.collect {
    println it
    it.isDirectory() ? it : zipTree(it)
  } }
}

在项目上运行命令plugin_consumer会引发错误:

> Failed to apply plugin [id 'my.custom.plugin']
   > Plugin with id 'my.custom.plugin' not found.

标签: javagradlegroovygradle-plugin

解决方案


我还没有发现问题,但已经找到了解决方案。不知何故jar,打包所有源代码的指令弄乱了插件 jar 文件。以下配置已在插件端起作用:

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

configurations {
  compileWithDependencies
}

dependencies {
  compile gradleApi()
  compileWithDependencies 'my.dependency1'
  compileWithDependencies 'my.dependency1'
  testCompile 'test.dependency'

  configurations.compile.extendsFrom(configurations.compileWithDependencies)
}

从外观上看,我猜gradleApi()不应该将依赖项编译到插件 jar 中。


推荐阅读