plugins - Gradle 编译依赖项未包含在 Jar 中

标签 plugins jar compilation gradle dependencies

我有一个 jar,build-plugins.jar,其中包含一个 gradle 插件,该插件是在 build.gradle 中使用此插件构建的:

apply plugin 'java'
    dependencies {
    compile gradleApi()
       compile localGroovy()
       compile('eviware:maven-soapui-plugin:4.5.1')
       compile('org.antlr:stringtemplate:4.0.2')
       compile('commons-io:commons-io:2.4')
       compile('joda-time:joda-time:2.1')
    }

这将构建 build-plugins.jar。并且使用插件的项目通过文件引用插件jar

apply plugin 'thepluginwahoo'
buildscript {
dependencies {
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.1'
        classpath files('/path/to/build-plugins.jar')
    }
}

问题是当我运行第二个项目的任何任务时,我得到“无法为类 xyz 创建类代理”,根本原因是四个依赖项(joda-time、commons-io、stringtemplate、maven -soapui-plugin)不存在。如果我将依赖项添加到使用插件的项目中,那么它就可以正常工作:

apply plugin 'thepluginwahoo'
buildscript {
    dependencies {
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.1'
        classpath files('/path/to/build-plugins.jar')
        classpath 'eviware:maven-soapui-plugin:4.5.1'
        classpath 'org.antlr:stringtemplate:4.0.2'
        classpath 'joda-time:joda-time:2.1'
        classpath 'commons-io:commons-io:2.4'
    }

}

我的问题是,当 jar 包含在插件使用项目的构建脚本的类路径中时,为什么插件项目中的“编译”依赖项的类不会出现在插件使用项目中。

最佳答案

Jars 通常不包含其依赖项。相反,它们与某种描述工件依赖关系的元数据描述符(pom.xml 或 ivy.xml)一起发布到存储库。当您直接将 jar 文件作为依赖项引用时,Gradle 无法知道其传递依赖项是什么。您有几种方法可以解决这个问题:

  1. 将您的插件 jar 连同必要的元数据(Gradle 将为您执行的操作)一起发布到存储库,并将其作为 external module dependency 引入。
  2. 使用 client module dependency 显式声明插件的传递依赖项.
  3. 使用类似 Gradle fatjar 的东西或shadow用于在 jar 中捆绑依赖项的插件。

关于plugins - Gradle 编译依赖项未包含在 Jar 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934524/

相关文章:

java - 如何强制设置 Java (.jar) 应用程序窗口的大小?

C 根据优化级别给出不同的输出(新示例)

eclipse - 如何在 Eclipse 插件开发中处理自定义编辑器的属性表?

javascript - rails 4 : View Doesn't Scroll when using One Page Scroll v1. 3

plugins - 安装 vagrant-vsphere 插件

linux - 在目标内部设置 make 变量

MySQL 和 Matlab

java - Eclipse 插件 : Pass values from one View to other View

java - 在Java中是否有可能读取放置在Jar中的文件也将其放置在Ear中?

找不到 Java 主文件