首先,对于具体的问题以及缺少MCVE表示抱歉,这是由于人工制品发布的性质导致了此问题。
一个依赖于自身的项目听起来似乎没有任何意义,但我相信阅读下面的解释后,它会确定。
我正在尝试引导代码生成器,该代码生成器使用自身的早期版本来生成其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上已发布的工件,它使用了build/libs/
中不存在的工件,由此可见输出:
/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/
中的工件)解决依赖关系?有没有办法忽略此工件并通过以下方式强制解决问题jcenter?
答案 0 :(得分:1)
默认情况下,Gradle将二进制依赖项与项目标识符进行匹配,并定期解决冲突。
因此,如果您的插件是同一group:name
的更高版本,则您将无法从外部存储库解析旧版本。
它与0.2.0
一起使用的事实很奇怪。您是否还修改过group
或name
?
有关解决方法,请参见Gradle issue tracker。