Как maven-опубликовать JAR-проект Gradle с предоставленной областью действия
Имеется веб-проект Gradle, который должен быть опубликован в виде JAR (чтобы он мог быть зависимостью от другого веб-проекта Gradle, который имеет другой цикл выпуска).
maven-publish
Плагин используется:
apply plugin: 'war'
apply plugin: 'maven'
apply plugin: 'maven-publish'
Веб-проект имеет providedCompile
зависимость:
providedCompile 'javax.servlet:javax.servlet-api:3.0.1'
"Яр" публикуется с использованием mavenJava
:
publishing {
publications {
// mavenJava publishes a jar file
mavenJava(MavenPublication) {
from components.java
}
}
repositories {
mavenLocal()
}
}
Проблема в том, что javax.servlet-api
имеет runtime
Область действия в результате Maven POM:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>runtime</scope>
</dependency>
Область применения сервлет-API не имеет смысла, даже вредна. Как можно установить область действия provided
в pom.xml?
1 ответ
С помощью pom.withXml
(см. этот пример Gradle) возможно преобразовать Gradle's providedCompile
в provided
Область применения Maven's POM:
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
раздел проходит через все зависимости типа providedCompile
в рамках конфигурации проекта Gradle и изменения области, которая будет записана в Maven pom.xml
от 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>