给定一个将作为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'
A jar
使用mavenJava
:
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
?
在pom.withXml
的帮助下(参见这个Gradle示例),可以将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>