【问题标题】:How to maven-publish a Gradle project JAR with provided scope如何使用提供的范围发布 Gradle 项目 JAR
【发布时间】:2014-10-01 19:25:17
【问题描述】:

给定一个将作为 JAR 发布的 Gradle Web 项目(这样它就可以成为另一个具有不同发布周期的 Gradle Web 项目的依赖项)。

使用了maven-publish插件:

apply plugin: 'war'
apply plugin: 'maven'
apply plugin: 'maven-publish'

web 项目有一个providedCompile 依赖:

providedCompile 'javax.servlet:javax.servlet-api:3.0.1'

使用mavenJava 发布jar

publishing {
    publications {
        // mavenJava publishes a jar file
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        mavenLocal()
    }
}

问题是 javax.servlet-api 在生成的 Maven POM 中有一个 runtime 范围:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>runtime</scope>
</dependency>

运行时范围对 servlet-api 没有意义,它甚至是有害的。 pom.xml中的范围如何设置为provided

【问题讨论】:

    标签: maven pom.xml gradle-2


    【解决方案1】:

    借助 pom.withXml(请参阅此 Gradle sample),可以将 Gradle 的 providedCompile 转换为 Maven 的 POM 的 provided 范围:

    publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java
    
                // providedCompile -> provided scope
                pom.withXml {
                    asNode().dependencies.'*'.findAll() {
                        it.scope.text() == 'runtime'  && project.configurations.providedCompile.allDependencies.find { dep ->
                            dep.name == it.artifactId.text()
                        }
                    }.each() {
                        it.scope*.value = 'provided'
                    }
                }
            }
        }
        repositories {
            mavenLocal()
        }
    }
    

    pom.withXml 部分的作用是遍历 Gradle 项目配置中 providedCompile 类型的所有依赖项,并将写入 Maven pom.xml 的范围从 runtime 更改为 provided

    生成的pom.xml 现在为javax.servlet-api 设置了provided 范围:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <modelVersion>4.0.0</modelVersion>
        [...]
        <dependencies>
            [...]
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </project>
    

    【讨论】:

    • Gradle 4.5.1 的工作方式有点不同:它生成的 POM 将 servlet-api 的范围设置为 compile。上面的解决方案仍然有效,您只需要匹配it.scope.text() == 'compile'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多