首先,对于有点具体的问题和缺乏 MCVE 感到抱歉,这是由于 Artifact 发布的性质导致了这个问题。
一个依赖于自身的项目可能听起来没有意义,但在阅读下面的解释后我确信它会有意义。
<小时/>我正在尝试引导一个代码生成器,它使用自身的早期版本来生成其部分 Java 代码。代码生成器本身可以工作,我为其编写的 Gradle 插件也可以工作。问题是该插件需要指定依赖项来声明要使用的工具版本。因此该项目对其自身有依赖性(尽管是旧版本)。
该工具的 build.gradle
如下所示:
plugins {
id 'java'
id 'de.clashsoft.gentreesrc-gradle' version '1.2.3'
id 'maven-publish'
}
// name = 'gentreesrc' (settings.gradle)
version = '0.3.1'
group = 'de.clashsoft'
repositories {
// where the artifact is published
jcenter()
}
dependencies {
// the configuration added by the plugin
gentreesrc group: 'de.clashsoft', name: 'gentreesrc', version: '0.3.1'
}
// publishing configuration...
现在,该插件创建 gentreesrc
配置(没有任何花哨的额外内容),以及一个名为 gentreesrcJava
的任务:
task gentreesrcJava(type: JavaExec) {
// ...
classpath = configurations.gentreesrc
main = 'de.clashsoft.gentreesrc.Main'
// ...
}
当我尝试在我的工具项目上运行此任务时,出现错误:
> Task :gentreesrcJava FAILED
Error: Could not find or load main class de.clashsoft.gentreesrc.Main
我已将问题追溯到我的 gentreesrc
依赖项的解决方案:它没有将其解决为 jcenter 上已发布的 Artifact ,而是使用 build/libs/中不存在的 Artifact
,如以下输出所示:
/Users/me/projectDir/build/libs/gentreesrc-0.3.1.jar
/Users/me/.gradle/caches/modules-2/files-2.1/org.antlr/antlr4-runtime/4.7.2/e27d8ab4f984f9d186f54da984a6ab1cccac755e/antlr4-runtime-4.7.2.jar
/Users/me/.gradle/caches/modules-2/files-2.1/org.antlr/ST4/4.1/467d508be07a542ad0a68ffcaed2d561c5fb2e0c/ST4-4.1.jar
/Users/me/.gradle/caches/modules-2/files-2.1/commons-cli/commons-cli/1.4/c51c00206bb913cd8612b24abd9fa98ae89719b1/commons-cli-1.4.jar
/Users/me/.gradle/caches/modules-2/files-2.1/org.antlr/antlr-runtime/3.5.2/cd9cd41361c155f3af0f653009dcecb08d8b4afd/antlr-runtime-3.5.2.jar
对build.gradle
添加以下内容:
gentreesrcJava.doFirst {
gentreesrcJava.classpath.each { println it }
}
有趣的是,当我将 version = '0.3.1'
部分更改为 version = '0.4.0'
(类路径输出的第一行)时,也会发生这种情况更改为 /Users/me/projectDir/build/libs/gentreesrc-0.4.0.jar
)。
但是,编写 version = '0.2.0'
不会导致任何问题(构建不会失败并且按预期工作)。
现在讨论实际问题:为什么 Gradle 会按照它的方式解决依赖关系(对 build/libs/
中的 Artifact )? 有没有办法忽略这个 Artifact 和力通过 jcenter 解析?
最佳答案
Gradle 默认情况下会将二进制依赖项与项目标识符进行匹配,并定期解决冲突。
因此,如果您的插件是同一group:name
的更高版本,那么您将无法从外部存储库解析旧版本。
它与 0.2.0
一起工作的事实很奇怪。您是否也修改了组
或名称
?
有关解决方法,请参阅 Gradle issue tracker .
关于java - Gradle 自依赖解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55885197/