使用gradle将pom.xml包含在Jar包中

3

我正在尝试将一个生成的pom.xml文件包含在我使用gradle创建的jar中。

到目前为止,在我的父项目中,我已经:

subprojects {
    apply plugin: 'maven-publish'

    publishing {
        publications {
            maven(MavenPublication) {
                from(components.java)
            }
        }
    }
}

在子项目中,我有:

tasks.build.dependsOn install

sourceSets {
    main {
        resources {
            srcDirs = [ "src/main/resources", "build/poms" ]
        }
    }
}


这将生成./build/poms/pom-default.xml,但不会将其添加到JAR包中。
在比build更早的阶段创建依赖项会创建循环依赖(而且我也不知道这是否是问题所在)。
另外,我希望pom.xml以名称pom.xml(而不是pom-default.xml)显示在META-INF内,因此这可能不是正确的方法。
不知何故,我认为它不可能像看起来那样复杂?

这似乎过于复杂了。当然,这取决于你想做什么,但你可以通过在module-B的build.gradle文件中添加:dependencies { compile project(':moduleA') }来让module-B导入module-A。 - Daniele
1个回答

3

您可以通过在subprojects闭包中添加以下内容,将POM包含在JAR中:

jar {
    into("META-INF/maven/${project.group}/${project.name}") {
        from generatePomFileForMavenPublication
        rename { it.replace('pom-default.xml', 'pom.xml') }
    }
}

如果您已经有了一个jar文件,可以在那里添加它。这会自动在任务上创建generatePomFileForMavenPublication 任务依赖关系,以便在创建JAR文件时存在POM文件。
此过程不需要您提供问题中的sourceSets部分。
(附注:实际上这样做并非绝对必要,因为Maven发布流程会将POM作为独立的构件发布。)

2
这就是整个Gradle的令我难以理解之处。我可以问一些后续问题吗?1)在文档中,我应该从哪里开始阅读以找到信息的线索,最终自己得出答案?2)pom-default.xml位于非常不同的目录中:它是如何找到它的?3)如果我正在寻找您答案中每个名词的文档,我该怎么做?例如,“rename”、“it”和“into”来自哪里? - Johannes Ernst
我会尝试。JAR 是由 Jar 任务创建的,该任务具有 into() 方法,因为它也是 CopySpecrename 也是 Jar 任务的一个方法。it 是 Groovy 语法,指当前迭代器对象。从一个任务中获取文件 from 指的是另一个任务声明的输出。 - barfuin
@JohannesErnst 当我开始学习Gradle时,我发现设置一个现代化的IDE(例如IntelliJ)非常有帮助,因为它可以让我点击所有这些奇怪的方法(如into、rename、it),并在(开放的)源代码中获取开发者文档。 - Alex
请注意,为了能够使用“mvn install-file”命令安装jar包,我必须将pom.xml文件放置在META-INF子文件夹中,例如“META-INF/maven/${project.group}/${project.name}”。 - Alex
好的,这使得示例更适合实际使用了。@Alex - barfuin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接