使用Gradle在jar中生成pom.xml

9

我希望使用IntelliJ/Gradle生成一个包含pom.xml的jar文件,以便在另一个项目中使用。 我尝试了以下build.gradle代码:

group 'com.test'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'maven-publish'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}
jar {
    into("META-INF/maven/$project.group/$project.name") {
        from generatePomFileForMavenJavaPublication
        rename ".*", "pom.xml"
    }
}
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile group: 'postgresql', name: 'postgresql', version: '9.1-901.jdbc4'
}

但是我遇到了以下错误:
'jar' cannot be applied to '(groovy.lang.closure <org.gradle.api.tasks.bundling.AbstractArchiveTask> )'
< p>Gradle 说:

Could not find property 'generatePomFileForMavenJavaPublication' on
task ':jar'.

还有其他方法吗?

generatePomFileForMavenJavaPublication是什么?看起来它会引起问题.. - Opal
也许你应该使用 maven-deploy Gradle 插件来完成这个任务? - Vampire
1
generatePomFileForMavenJavaPublication 是 Gradle 中 publishing 列表中的一个任务,它会在 build 目录下创建 pom.xml 文件。 - Manuel Jordan
你想在另一个项目中如何使用jar? - Alex78191
@Alex78191,使用 mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile=somejar-built-with-gradle.jar 命令。我在一个多阶段的 Bamboo 构建中使用它,在其中一个阶段使用 Gradle 打包一个 jar 文件,下一个阶段使用 Maven 编译该 jar 文件。 - Alex
3个回答

4

任务generatePomFileForMavenJavaPublication在配置阶段后期创建。您需要通过将任务分配为Closure返回类型来推迟对任务的引用创建。

apply plugin: 'maven-publish'
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

jar {
    into("META-INF/maven/$project.group/$project.name") {
        from { generatePomFileForMavenJavaPublication }
        rename ".*", "pom.xml"
    }
}

from Github


1
这对我有用,但有两个显著的不同之处:1)不需要 publishing.publications 部分 2)必须将 generatePomFileForMavenJavaPublication 重命名为 generatePomFileForPluginMavenPublication(这里是 gradle 4.10.3)。 - Alex
@Alex,你需要使用apply plugin: 'maven-publish'吗? - Alex78191
是的,当然,否则将找不到generatePomFileForPluginMavenPublication。请注意,根据https://docs.gradle.org/current/userguide/plugins.html#sec:plugins_block,我使用的是`plugins { id 'maven-publish' }而不是apply plugin: 'maven-publish'`。 - Alex
更正:generatePomFileForPluginMavenPublication 是由 java-gradle-plugin 提供的,而不是 maven-publishmaven-publishing 提供了 publishing {}。我使用 java-gradle-plugin 而不是 java,因为我正在为 Gradle 插件构建代码。 - Alex

1

from需要一个文件或路径。而你所提供的generatePomFileForMavenJavaPublication是一个任务,绝对不是文件或路径,因此无法使用。

你可以将generatePomFileForMavenJavaPublication作为jar的前提条件,并在构建目录中获取它创建的pom文件。

以下内容应该可以实现这一点:

jar {
    dependsOn generatePomFileForMavenJavaPublication
    from("$builddir/pom.xml") //Or whatever path it goes to in the generate task.
    into("META-INF/maven/$project.group/$project.name")
}

2
似乎Gradle找不到任务generatePomFileForMavenJavaPublication(我编辑了我的问题,从Gradle中找到了另一个错误消息)。 - Manuel Jordan

-1

我刚刚发现 pom.xml 不一定要在 jar 包内部。

当我发布到 Maven 本地仓库时它可以工作(而不是 Maven 中央仓库):

group 'ch.test'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'maven-publish'

sourceCompatibility = 1.5

repositories {
    mavenLocal()
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java

        }
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile group: 'postgresql', name: 'postgresql', version: '9.1-901.jdbc4'
}

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