Как сделать так, чтобы задание Gradle ShadowJar также создавало источники и javadoc его детей?
У меня есть проект gradle с 8 дочерними проектами и настроенная задача shadowjar для создания jar-файла all. Проект верхнего уровня настроен так, чтобы иметь зависимости от всех его дочерних элементов, это говорит shadowjar, что включать:
project(':') {
dependencies {
compile project(':jfxtras-agenda')
compile project(':jfxtras-common')
compile project(':jfxtras-controls')
compile project(':jfxtras-icalendarfx')
compile project(':jfxtras-icalendaragenda')
compile project(':jfxtras-menu')
compile project(':jfxtras-gauge-linear')
compile project(':jfxtras-font-roboto')
}
}
shadowJar {
classifier = null // do not append "-all", so the generated shadow jar replaces the existing jfxtras-all.jar (instead of generating jfxtras-all-all.jar)
}
Это работает нормально, но maven central отказывается от всей фляги, потому что у нее нет связанных источников и фляги javadocs.
Как мне сказать gradle также генерировать исходники и javadoc? Документация ShadowJar говорит, что он должен делать это по умолчанию.
2 ответа
Теневой плагин, похоже, не имеет функции создания jar-файлов javadocs.
Ниже я приведу несколько коротких заданий (javadocJar
а также sourcesJar
), который будет создавать толстые javadoc и исходные банки. Они связаны, чтобы всегда выполняться после shadowJar
, Но он не зависит от плагина теневой банки.
subprojects {
apply plugin: 'java'
}
// Must be BELOW subprojects{}
task alljavadoc(type: Javadoc) {
source subprojects.collect { it.sourceSets.main.allJava }
classpath = files(subprojects.collect { it.sourceSets.main.compileClasspath })
destinationDir = file("${buildDir}/docs/javadoc")
}
task javadocJar(type: Jar, dependsOn: alljavadoc) {
classifier = 'javadoc'
from alljavadoc.destinationDir
}
task sourcesJar(type: Jar) {
classifier = 'sources'
from subprojects.collect { it.sourceSets.main.allSource }
}
shadowJar.finalizedBy javadocJar
shadowJar.finalizedBy sourcesJar
Обратите внимание subprojects
раздел обязателен, даже если вы уже применили java
плагин внутри ваших подпроектов.
Также обратите внимание, что он не включает javadocs сторонних библиотек, от которых могут зависеть ваши подпроекты. Но обычно вам все равно не захочется этого делать.
Это старая тема, но я публикую свое решение, так как оно намного проще, чем приведенное выше, и я подтвердил, что оно работает:
plugins {
id 'com.github.johnrengelman.shadow' version '7.1.0'
id 'signing'
id 'maven-publish'
}
// If using Spring Boot, this is needed
jar.enabled = true
jar.dependsOn shadowJar
java {
withJavadocJar()
withSourcesJar()
}
// Remove the -all extension from the "fat" Jar, or it can't be used
// when published to Maven Central.
shadowJar {
archiveClassifier.set('')
}
// The contents of this section are described here:
// https://docs.gradle.org/current/userguide/publishing_maven.html
publishing {
publications {
jwtopaLibrary(MavenPublication) {
artifactId = 'jwt-opa'
artifacts = [ shadowJar, javadocJar, sourcesJar ]
pom {
// etc. ...
}
// Signs the `publication` generated above with the name `jwtopaLibrary`
// Signing plugin, see: https://docs.gradle.org/current/userguide/signing_plugin.html#signing_plugin
signing {
sign publishing.publications.jwtopaLibrary
}
Это нигде не разъяснено, и информацию нужно собирать в нескольких местах, но для
signing
плагин для работы, вам нужно
short form
идентификатор шестнадцатеричного ключа:
# gradle.properties
# The `signing` plugin documentation is less than helpful;
# however, this is the magic incantation to find the `keyId`:
#
# gpg --list-signatures --keyid-format 0xshort
#
# The key also needs to be distributed to public GPG servers:
#
# gpg --keyserver keyserver.ubuntu.com --send-keys 123...fed
#
# In all cases, we need to use the values from the `pub` key.
signing.keyId=0x1234abcde
Тогда это просто вопрос запуска
./gradlew publish
и происходит волшебство (ну, не совсем, вам все равно нужно зайти в репозиторий Sonatype, исполнить танец «закрыть и отпустить», но вы знаете, что угодно).