我在名为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的内容?
要重现此问题,请将以下片段复制到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
,尽管它们有不同的组。
答案 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)
java library distribution插件添加distZip
任务类型为Zip的rename任务,因此您可以执行此操作
def count = 1
distZip {
rename 'util.*\\.jar', "util${count++}.jar"
}