java - Gradle 自依赖解析

标签 java maven gradle gradle-dependencies

首先,对于有点具体的问题和缺乏 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/

相关文章:

java - ContainerProvider 的独立 Java Websocket 客户端 NoClassDefFoundError

java - Gradle 不在命令行上执行任何测试

java 8 javafx getBehavior() 替代方案?

java - mvc :resources leads to ClassCastException

java - 在后端 Java EE 的表中使用 Angular2 获取一个元素

java - intelliJ 中的 Maven 无法读取 Artifact 描述符 - 启用快照更新

java - 如何使用 Maven 将 Web 应用程序部署到现有 Jetty?

android - 单击运行按钮时 android studio 运行的任务是什么?

Android Gradle 插件 : Property 'applicationId' is not annotated with an input or output annotation

java - RESTeasy ContainerRequestFilter 永远不会被调用