Gradle - 不要在包含的依赖项名称中指定版本

时间:2018-04-15 06:28:21

标签: gradle

我的应用程序被打包为ear,我使用了earlib和部署配置。但是对于所有这些依赖项,jar名称中都会提到版本。 例如,如果我提到如下的依赖关系,

earlib 'com.xyz:abc:1.0.1'

在生成的耳朵中,我可以看到jar名称为abc-1.0.1.jar,但我想将其简单地包含在abc.jar中。

2 个答案:

答案 0 :(得分:1)

声明没有版本

的依赖项

Gradle允许你declare a dependency without a version,但你必须定义一个dependency constraint,它基本上是你的依赖版本的定义。这通常用于大型项目:

dependencies {
    implementation 'org.springframework:spring-web'
}

dependencies {
    constraints {
        implementation 'org.springframework:spring-web:5.0.2.RELEASE'
    }
}

声明动态版本

另一个选项是使用加号运算符declare a dynamic version。这允许您在打包应用程序时使用最新的依赖关系。这样做有潜在危险,因为它有可能破坏应用程序:

apply plugin: 'java-library'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework:spring-web:5.+'
}

声明文件依赖

如果您根本不想依赖二进制存储库而是自己提供依赖关系,则可以antlibstools目录declare a file dependency 。这允许您根据需要命名和版本依赖项,但您必须自己维护它们:

configurations {
    antContrib
    externalLibs
    deploymentTools
}

dependencies {
    antContrib files('ant/antcontrib.jar')
    externalLibs files('libs/commons-lang.jar', 'libs/log4j.jar')
    deploymentTools fileTree(dir: 'tools', include: '*.exe')
}

答案 1 :(得分:0)

注意我建议您不要删除版本,因为它们是应用程序无法运行时的重要诊断信息。

ear任务是Ear任务类型的一个实例,而后者基本上是标准Zip任务类型的一种特殊形式。所有归档任务都允许您在文件打包时重命名。

例如,以下内容可能有效:

ear {
    rename '(.+)-[^-].+(\\.jar)', '$1$2'
    lib {
        rename '(.+)-[^-].+(\\.jar)', '$1$2'
    }
}

我强烈建议您查看Working with files上的新用户手册章节,了解有关复制和存档文件的更多信息。希望我能记得在Gradle 4.7退出后用非发布候选链接更新这个答案。

另外,如果您对该章有任何反馈,请告诉我。

编辑根据OP的反馈,我发现Ear任务在earlib配置中使用了JAR的子复制规范。子规范独立于主要规范和其他子规范,因此主rename()不适用于earlib文件。这就是我们通过rename()块添加lib {}的原因。