Gradle自立解决方案

时间:2019-04-27 21:57:14

标签: java maven gradle gradle-dependencies

首先,对于具体的问题以及缺少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?

1 个答案:

答案 0 :(得分:1)

默认情况下,Gradle将二进制依赖项与项目标识符进行匹配,并定期解决冲突。

因此,如果您的插件是同一group:name的更高版本,则您将无法从外部存储库解析旧版本。 它与0.2.0一起使用的事实很奇怪。您是否还修改过groupname

有关解决方法,请参见Gradle issue tracker