英文:
How to generate pom file for a gradle project with all dependencies?
问题
我有一个Gradle项目,它将依赖项存储在toml文件中。我想生成带有依赖项的pom文件。这是我的build.gradle文件:
plugins {
    id 'maven-publish'
}
dependencies {
    api(libs.bundles.api) {
        exclude(group: 'org.apache.hadoop', module: 'zookeeper')
        exclude(group: 'org.apache.hadoop', module: 'slf4j-log4j12')
        exclude(group: 'org.apache.hadoop', module: 'log4j')
        exclude(group: 'org.apache.hadoop', module: 'jsp-api')
        exclude(group: 'org.apache.hadoop', module: 'servlet-api')
    }
    compileOnly(libs.slf4j.api)
    testImplementation(libs.bundles.test.implementation)
    annotationProcessor(libs.lombok)
    testAnnotationProcessor(libs.lombok)
}
publishing {
    publications {
        customPublication(MavenPublication) {
            from components.java
        }
    }
}
当我运行以下命令时:
> gradle publishToMavenLocal
我只能从libs.bundles.api获得带有依赖项的pom文件。对于compileOnly、testImplementation、annotationProcessor和testAnnotationProcessor作用域,没有依赖项。请帮助解决这个问题。
英文:
I have a Gradle project which stores dependencies in toml file. I want to generate pom file with dependencies. This is my build.gradle file:
plugins {
    id 'maven-publish'
}
dependencies {
    api ( libs.bundles.api) {
        exclude(group: 'org.apache.hadoop', module: 'zookeeper')
        exclude(group: 'org.apache.hadoop', module: 'slf4j-log4j12')
        exclude(group: 'org.apache.hadoop', module: 'log4j')
        exclude(group: 'org.apache.hadoop', module: 'jsp-api')
        exclude(group: 'org.apache.hadoop', module: 'servlet-api')
    }
    compileOnly(libs.slf4j.api)
    testImplementation(libs.bundles.test.implementation)
    annotationProcessor(libs.lombok)
    testAnnotationProcessor(libs.lombok)
}
publishing {
    publications {
        customPublication(MavenPublication) {
            from components.java
        }
    }
}
When I run
> gradle publishToMavenLocal
I get pom file with dependencies only from libs.bundles.api. There aren't dependencies for scope compileOnly, testImplementation, annotationProcessor, testAnnotationProcessor. Please help to figure out this problem.
答案1
得分: 1
发布的POM文件只包含运行时依赖项,这些依赖项是用于使用和运行项目的。
compileOnly
这些只需要用于编译您的项目,而不需要用于运行项目。
testImplementation
这些只需要用于运行项目的测试,而不需要用于运行它作为依赖项。
annotationProcessor
这些仅在构建项目期间使用,不需要在运行时使用。
testAnnotationProcessor
这些仅在构建项目测试时需要,不需要供其他人使用您的项目时。
要执行您想要的操作,您需要自定义发布的POM文件:
build.gradle.kts
这是使用Kotlin DSL编写的,但可以轻松转换为Groovy DSL。
publishing {
    publications {
        create<MavenPublication>("fakePom") {
            this.pom.withXml {
                val allDeps = project.configurations.runtimeClasspath.get().resolvedConfiguration.firstLevelModuleDependencies +
                    project.configurations.compileClasspath.get().resolvedConfiguration.firstLevelModuleDependencies +
                    project.configurations.testRuntimeClasspath.get().resolvedConfiguration.firstLevelModuleDependencies +
                    project.configurations.testCompileClasspath.get().resolvedConfiguration.firstLevelModuleDependencies
                val root = asNode()
                root.children()
                    .filterIsInstance<Node>()
                    .map { it as Node }
                    .filter { "dependencies" == it.name() || "dependencyManagement" == it.name() }
                    .forEach {
                        root.remove(it)
                    }
                val ds = root.appendNode("dependencies")
                allDeps.forEach { d ->
                    val dn = ds.appendNode("dependency")
                    dn.appendNode("groupId", d.moduleGroup)
                    dn.appendNode("artifactId", d.name)
                    dn.appendNode("version", d.moduleVersion)
                }
            }
        }
    }
}
./gradlew generatePomFileForFakePomPublication
英文:
A published POM file will only contain the runtime dependencies. The dependencies needed to consume and run the project. And that is correct.
> compileOnly
These are only needed to compile your project, and not needed to run your project.
> testImplementation
These are only needed to run the tests of your project and not needed to run it as a dependency.
> annotationProcessor
These are only used during the build of your project and are not needed to run it.
> testAnnotationProcessor
These are only needed during the build of your tests of your project and not needed for a consumer to use your project.
In order to do what you want, you need to customize the POM in publishing:
build.gradle.kts
This is in Kotlin DSL, but can easily be converted to Groovy DSL.
publishing {
    publications {
        create<MavenPublication>("fakePom") {
            this.pom.withXml {
                val allDeps = project.configurations.runtimeClasspath.get().resolvedConfiguration.firstLevelModuleDependencies +
                    project.configurations.compileClasspath.get().resolvedConfiguration.firstLevelModuleDependencies +
                    project.configurations.testRuntimeClasspath.get().resolvedConfiguration.firstLevelModuleDependencies +
                    project.configurations.testCompileClasspath.get().resolvedConfiguration.firstLevelModuleDependencies
                val root = asNode()
                root.children()
                    .filterIsInstance<Node>()
                    .map { it as Node }
                    .filter { "dependencies" == it.name() || "dependencyManagement" == it.name() }
                    .forEach {
                        root.remove(it)
                    }
                val ds = root.appendNode("dependencies")
                allDeps.forEach { d ->
                    val dn = ds.appendNode("dependency")
                    dn.appendNode("groupId", d.moduleGroup)
                    dn.appendNode("artifactId", d.name)
                    dn.appendNode("version", d.moduleVersion)
                }
            }
        }
    }
}
./gradlew generatePomFileForFakePomPublication
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论