gradle installDist:如何将组ID添加到依赖jar名称(由于组ID不同但工件ID和版本相同而发生冲突)?

时间:2017-02-11 10:01:27

标签: gradle build.gradle

Gradle中的问题

我在名为build.gradle的目录中有proj

apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
    mavenCentral()
}
dependencies {
    compile 'com.davfx:util:1.0.0'
    compile 'org.johnnei:util:1.0.0'
}

然后我运行gradle installDist并发现目录build/install/proj/lib只包含一个util-1.0.0.jar。我期待两个util-1.0.0.jar文件,但我认为由于文件系统的工作方式,这是不可能的。

问题是:如何在jar名称前添加组ID? Gradle是否有类似Maven' prependGroupId的内容?

Maven中的同样问题

要重现此问题,请将以下片段复制到pom.xml,然后在同一目录中运行mvn dependencies:copy-dependencies。注意target/dependency目录只包含一个文件util-1.0.0.jar。但是,与Gradle不同,Maven可以通过prependGroupId来解决这个问题。 (在评论部分归功于Tunaki。)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.spacetimecat</groupId>
    <artifactId>example</artifactId>
    <version>0.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.davfx</groupId>
            <artifactId>util</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.johnnei</groupId>
            <artifactId>util</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>

</project>

旧(更一般)问题描述

让这两个坐标有两个项目:

  • G:A:1.2.3
  • H:A:1.2.3

也就是说,它们具有不同的组ID,但具有相同的工件ID和版本。

假设我创建了一个依赖于这两者的项目P。当我汇编一个分发包(一个包含我的项目jar及其所有传递依赖项的包)时,我只获得一个web-1.7.0.jar文件。问题是:依赖项中的一个jar文件被覆盖,因为它们具有相同的文件名,因为Gradle / Maven默认将jars命名为artifactId-version-classifier.jar,尽管它们有不同的组。

2 个答案:

答案 0 :(得分:3)

它很乱,但您可以针对tempCompile配置声明您的依赖项,然后向renamejars添加DAG任务,将{j}重命名为$buildDir/renamedJars目录。然后,compile配置可以包含$buildDir/renamedJars目录中的jar。

重要 - 此解决方案将丢失所有依赖项的组/工件/版本,这意味着下游项目将无法执行依赖项解析。

configurations {
    tempCompile
}
dependencies {
    tempCompile 'com.davfx:util:1.0.0'
    tempCompile 'org.johnnei:util:1.0.0'
    compile fileTree("$buildDir/renamedJars")
}
task renameJars {
    inputs.files configurations.tempCompile
    outputs.dir "$buildDir/renamedJars"
    doLast {
        mkdir "$buildDir/renamedJars"
        ResolvedConfiguration rc = configurations.tempCompile.resolvedConfiguration
        Set<ResolvedArtifact> artifacts = rc.resolvedArtifacts
        artifacts.each { ra ->
            ModuleVersionIdentifier mvi = ra.moduleVersion.id
            copy {
                from ra.file
                into "$buildDir/renamedJars"
                rename { old ->
                    return "${mvi.group}-${mvi.name}-${ra.classifier}-${mvi.version}.${ra.extension}"
                }
            }
        }
    }
}
compileJava.dependsOn renameJars

答案 1 :(得分:0)

我很惊讶我之前没有听说过这个问题,我猜测War插件会遇到同样的问题。有趣的是看到maven遭遇同样的问题。

java library distribution插件添加distZip任务类型为Ziprename任务,因此您可以执行此操作

def count = 1
distZip {
    rename 'util.*\\.jar', "util${count++}.jar"
}