I want to configure my build script written with Kotlin DSL.
My goals are four:
- When I run
gradle build, Gradle should produce shadowed jar as ‘main jar’(without-allpostfix) in<root>/build/libdirectory.
Currently, Gradle produces JAR file in subdirectory of each subprojects.
Since the reason of shadowing is ‘create AIO jar’, user of my project must use shadowed jar, not ‘main jar’. I don’t want to make them always append:allwhen declaring dependency. - When I run
gradle javadoc, Gradle should produce javadoc in<root>/build/docdirectory.
Currently, Gradle produces javadoc in subdirectory of each subprojects. I want my javadoc as AIO, not separated by subprojects. - When doing
buildorjavadoc, do not produce directories like<root>/core/buildand<root>/bukkit_1_19_R1/build(builddirectory in subprojects). I don’t want it. I want gradle things to be ‘centralized’. - When I publish to both local and remote, create both (1) and (2).
Currently, I can only see (1).
Here are my project’s build scripts.
// <root>/build.gradle.kts
@file:Suppress("SpellCheckingInspection")
plugins {
`java-library`
`maven-publish`
id("com.github.johnrengelman.shadow") version("7.1.2")
}
dependencies {
implementation(project(":bukkit_1_19_R1")) {
isTransitive = false
}
implementation(project(":core"))
}
tasks {
/*
* Goals:
* 1. When run 'gradle build', build only one shadowed jar which contains all files of subproject's.
* This should locate at '<root>/build/lib', not under each subproject's directory.
* This means shadowed jar will act as 'default generated jar'.
*
* 2. When run 'gradle javadoc', create one javadoc jar along with output of (1).
* This should contain all javadoc from subprojects, and does not create files under each subprojects.
*
* 3. When publish, create both (1) and (2).
*/
// Create shadowed jar as default
shadowJar {
archiveClassifier.set("")
}
publishing {
publications {
create<MavenPublication>("shadow") {
project.extensions.configure<com.github.jengelman.gradle.plugins.shadow.ShadowExtension> {
component(this@create)
artifact(javadoc)
}
}
}
}
javadoc {
source(
project(":core").sourceSets["main"].allJava,
project(":bukkit_1_19_R1").sourceSets["main"].allJava
)
}
}
allprojects {
apply(plugin = "java-library")
repositories {
mavenCentral()
maven("https://repo.papermc.io/repository/maven-public/")
}
group = "com.gitlab.exmserver"
version = "1.0.0-SNAPSHOT"
}
// <root>/core/build.gradle.kts
dependencies {
compileOnly("io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT")
}
// <root>/bukkit_1_19_R1/build.gradle.kts
plugins {
id("io.papermc.paperweight.userdev") version("1.3.8")
}
dependencies {
compileOnly(project(":core"))
paperweightDevelopmentBundle("io.papermc.paper:dev-bundle:1.19.2-R0.1-SNAPSHOT")
}
With these scripts, I have these problem.
- Javadoc tries to document
ItemStackclass which is not part of my project. Since Gradle cannot find javadoc for those kind of classes, it failes to create javadoc.
I want to disable ‘lookup’ or ‘link’ for those kind of classes which are not part of my project. I want them displayed as plain code text likeorg.bukkit.inventory.ItemStack, not hyper-linked.
If I must provide ‘link’ to those classes, I want to specify ‘base link’ where to find those kind of javadoc. Like ‘external javadoc’. - My scripts produces shadowed jar as ‘main jar’(without
-allpostfix), but this isn’t located at<root>/build/libdirectory. - Javadocs are not located at
<root>/build/docstoo.
How to configure my build scripts to behave as what I want?