【发布时间】:2019-07-21 22:46:21
【问题描述】:
How to amend Gradle plugins {} management repository for custom plugins? 在这篇文章中没有重复,因为它不包括 flatDir 的使用。
问题
如何使用在本地 JAR 中定义的 Gradle 插件,使用新的 plugin {} 语义,而不是已弃用的 apply() 语义?
当前状态
没有任何解决方案,在发布问题并进行了相当长的搜索后,我提交了 issue,想知道在 Gradle 的修订版中,这种本应常见且直接的用法是否不受设计或疏忽的支持插件语义。
很遗憾,我的报告已关闭,没有提供任何有用的信息。
我通过 new issue 要求澄清,但仍在等待。
我很沮丧,因为我期望社区至少会对讨论这个问题感兴趣。
如果您可以提供信息,请提供。
第一次更新
在澄清关于配置插件源的新样式之后,我更新了我的settings.gradle 文件以使用以下块打开。但是,我很遗憾,仅凭这一变化,我并没有看到任何改善。 (对于build.gradle 文件中引用的插件 id 字段,我尝试了 JAR 元数据中发布的全局 ID 和 JAR 文件的基本名称。两者都同样失败。)
pluginManagement {
repositories {
gradlePluginPortal()
jcenter()
flatDir {
dirs 'lib`'
}
}
}
文档解释了如何使用自定义存储库,但似乎忽略了普通平面目录的情况。
第二次更新
如果我将版本号添加到 JAR 文件和 plugins {} 块中的相应语句中,我会得到一些改进。在这种情况下,消息变为:
Plugin [id: 'plugin-id', version: '1.0.0'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'plugin-id:plugin-id.gradle.plugin:1.0.0')
Searched in the following repositories:
Gradle Central Plugin Repository
BintrayJCenter
flatDir(/absolute/path/to/lib)
在这种情况下,目录被添加到搜索的源列表中。
奇怪的是,.gradle.plugin 后缀被附加到打印工件中的我的 ID 上。将版本号添加到正在搜索的内容会影响正在搜索的地点列表,这也很奇怪。
所以我的项目仍然无法构建。感谢您提供任何进一步的帮助。
原始背景
我在项目的lib 目录中放置了一个包含自定义插件定义的JAR 文件。使用下面的build.gradle 构建文件,构建运行成功。
buildscript {
repositories {
flatDir {
dirs 'lib'
}
}
}
apply plugin: 'plugin-id'
但是,apply() 语义已被弃用,支持 plugins {} 块,因此我尝试如下更新构建文件。
plugins {
id 'plugin-id'
}
repositories {
flatDir {
dirs 'lib'
}
}
我了解plugins {} 内容可以从repositories {} 定义中提取。
但是,更改会导致失败:
* What went wrong:
Plugin [id: 'plugin-id'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)
保留plugin {} 块但将repositories {} 块移回前导buildscript {} 块并不能解决错误。也就是说,即使我恢复到早期版本,错误仍然存在,只是将 apply() 语句替换为 plugin {} 块。
最后,将dependencies { classpath: ':jarname' } 块添加到repositories {} 块没有任何效果,一些消息来源认为这是必要的,尽管我不知道为什么会这样。
【问题讨论】:
-
除非我添加
buildscript { dependencies { classpath '...' }}}部分,否则您已弃用的语法解决方案对我不起作用。仅指定存储库以解析插件是不够的,您还需要指定提供它的 jar 文件。将 flatDir 存储库与 maven 中心进行比较:除非您明确指定要在哪个 jar 中查找,否则 gradle 不会下载每个 jar。 -
@Alex 请澄清“解决方案不起作用”。该案例测试插件的发现。如果发现插件,则案例有效。顺便说一句,我认为类路径是在构建和运行的后期阶段相关的正交问题。
-
无法解决插件中的问题:
> Plugin with id 'plugin-id' not found.。我不确定你指的是什么测试用例。 Wrt 类路径,它适用于编译和运行时:您的代码引用的类需要在编译代码时和稍后运行时再次解析。 -
了解编译需要类路径,但编译是生成字节码,而直接的问题是插件解析。注释和取消注释
classpath块是导致 pluign not found 错误出现或消失的唯一区别吗? -
> 注释和取消注释类路径块是导致未找到插件错误出现或消失的唯一区别吗?:是的。我不明白您为什么要谈论插件解析,就好像它与类文件解析有什么不同:插件是分布在 jar 文件中的类(在 META-INF 中有附加描述符)。
标签: java gradle plugins repository local