给定一个要作为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'
'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
?
答案 0 :(得分:5)
在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
的所有依赖项,并将范围从pom.xml
更改为写入Maven runtime
到provided
。
生成的pom.xml
现在为provided
设置了javax.servlet-api
范围:
<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>