如何让 gradle 使用依赖元数据填充 jar?
How can I get gradle to populate jars with dependency metadata?
因此,如果我在 Maven 中构建一个 jar,例如 jackson-core-2.5.1.jar
,我会在工件中找到以下内容:
META-INF/maven/
META-INF/maven/com.fasterxml.jackson.core/
META-INF/maven/com.fasterxml.jackson.core/jackson-core/
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.properties
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.xml
然而,Gradle似乎并没有创建这个数据。问题是我们的构建有几个组件,包括一个父项目,它们没有托管在同一个 SCM 位置。对于我们庞大而复杂的构建,如果没有元数据,Gradle 如何知道一个 SCM 位置中本地构建的工件依赖于另一个 SCM 中本地构建的工件? Gradle 处理这种情况的方法是什么?
存储库包含 pom.xml
的单独副本。它通常位于磁盘物理结构中的 JAR 文件旁边。这适用于 Nexus 或 Artifatory 等二进制存储库,也适用于您的本地 Maven 存储库(在 $HOME/.m2/repo
下)。
如果出于某种原因您想复制 Maven 的行为,您可以告诉 Gradle 创建这些文件。我们在 subprojects
闭包中使用此自定义配置我们的多项目 Gradle 构建。
jar {
// until we have better solution
// https://discuss.gradle.org/t/jar-task-does-not-see-dependency-when-using-maven-publish/11091
if (project.tasks.findByName('generatePomFileForMavenJavaPublication')) {
dependsOn 'generatePomFileForMavenJavaPublication'
} else {
project.tasks.whenTaskAdded { addedTask ->
if (addedTask.name == 'generatePomFileForMavenJavaPublication') {
project.tasks.jar.dependsOn 'generatePomFileForMavenJavaPublication'
}
}
}
into("META-INF/maven/$project.group/$project.archivesBaseName") {
/*
from generatePomFileForMavenJavaPublication
*/
from new File(project.buildDir, 'publications/mavenJava')
rename ".*", "pom.xml"
}
}
如果 generatePomFileForMavenJavaPublication
有时懒惰地创建任务没有问题,那会更简单。你需要检查如何创建你的属性文件。我猜你可以从 运行 Gradle 进程那里转储属性。
因此,如果我在 Maven 中构建一个 jar,例如 jackson-core-2.5.1.jar
,我会在工件中找到以下内容:
META-INF/maven/
META-INF/maven/com.fasterxml.jackson.core/
META-INF/maven/com.fasterxml.jackson.core/jackson-core/
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.properties
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.xml
然而,Gradle似乎并没有创建这个数据。问题是我们的构建有几个组件,包括一个父项目,它们没有托管在同一个 SCM 位置。对于我们庞大而复杂的构建,如果没有元数据,Gradle 如何知道一个 SCM 位置中本地构建的工件依赖于另一个 SCM 中本地构建的工件? Gradle 处理这种情况的方法是什么?
存储库包含 pom.xml
的单独副本。它通常位于磁盘物理结构中的 JAR 文件旁边。这适用于 Nexus 或 Artifatory 等二进制存储库,也适用于您的本地 Maven 存储库(在 $HOME/.m2/repo
下)。
如果出于某种原因您想复制 Maven 的行为,您可以告诉 Gradle 创建这些文件。我们在 subprojects
闭包中使用此自定义配置我们的多项目 Gradle 构建。
jar {
// until we have better solution
// https://discuss.gradle.org/t/jar-task-does-not-see-dependency-when-using-maven-publish/11091
if (project.tasks.findByName('generatePomFileForMavenJavaPublication')) {
dependsOn 'generatePomFileForMavenJavaPublication'
} else {
project.tasks.whenTaskAdded { addedTask ->
if (addedTask.name == 'generatePomFileForMavenJavaPublication') {
project.tasks.jar.dependsOn 'generatePomFileForMavenJavaPublication'
}
}
}
into("META-INF/maven/$project.group/$project.archivesBaseName") {
/*
from generatePomFileForMavenJavaPublication
*/
from new File(project.buildDir, 'publications/mavenJava')
rename ".*", "pom.xml"
}
}
如果 generatePomFileForMavenJavaPublication
有时懒惰地创建任务没有问题,那会更简单。你需要检查如何创建你的属性文件。我猜你可以从 运行 Gradle 进程那里转储属性。