From 6ee16d2a82a45522044395ab2d4e949b63178dca Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Thu, 30 Oct 2025 12:47:11 +0100 Subject: [PATCH 1/6] feat(module): add kotlin module --- lasius-kotlin/build.gradle.kts | 26 ++++++ .../lasius/LasiusKotlinPlugin.kt | 80 +++++++++++++++++++ settings.gradle.kts | 4 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 lasius-kotlin/build.gradle.kts create mode 100644 lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt diff --git a/lasius-kotlin/build.gradle.kts b/lasius-kotlin/build.gradle.kts new file mode 100644 index 0000000..1714e44 --- /dev/null +++ b/lasius-kotlin/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + `kotlin-dsl` +} + +dependencies { + // Needed because your plugin applies and configures the Kotlin plugin + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin") + testImplementation(platform(libs.junit.bom)) + testImplementation(libs.junit.jupiter) + testRuntimeOnly(libs.junit.launcher) +} + +tasks.test { + useJUnitPlatform() +} + +gradlePlugin { + plugins { + register("lasiusKotlinPlugin") { + id = "${group}.lasius-kotlin" + implementationClass = "net.onelitefeather.lasius.LasiusKotlinPlugin" + displayName = "Lasius Kotlin Plugin" + description = "A gradle plugin to apply default settings to kotlin projects" + } + } +} \ No newline at end of file diff --git a/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt b/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt new file mode 100644 index 0000000..9f2a6e2 --- /dev/null +++ b/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt @@ -0,0 +1,80 @@ +package net.onelitefeather.lasius + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.api.tasks.testing.Test +import org.gradle.api.tasks.testing.logging.TestLogEvent +import org.gradle.kotlin.dsl.findByType +import org.gradle.kotlin.dsl.withType +import org.gradle.testing.jacoco.plugins.JacocoPlugin +import org.gradle.testing.jacoco.tasks.JacocoReport +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension +import java.nio.charset.StandardCharsets + +class LasiusKotlinPlugin : Plugin { + override fun apply(project: Project) { + applyPlugins(project) + configureKotlin(project) + configureJavaCompile(project) + configureTests(project) + configureJacoco(project) + } + + private fun applyPlugins(project: Project) { + project.pluginManager.apply("org.jetbrains.kotlin.jvm") + project.pluginManager.apply(JacocoPlugin::class.java) + } + + private fun configureKotlin(project: Project) { + project.extensions.findByType(KotlinJvmProjectExtension::class)?.apply { + jvmToolchain(21) + project.logger.lifecycle("Configured Kotlin JVM toolchain to Java 21 for ${project.name}") + } + } + + private fun configureJavaCompile(project: Project) { + project.tasks.withType(JavaCompile::class).configureEach { + options.encoding = StandardCharsets.UTF_8.displayName() + options.release.set(21) + } + } + + private fun configureTests(project: Project) { + project.tasks.withType(Test::class).configureEach { + useJUnitPlatform() + if (hasMinestomDependency(project)) { + jvmArgs("-Dminestom.inside-test=true") + } + + testLogging { + events = setOf( + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.FAILED + ) + } + + finalizedBy(project.tasks.named("jacocoTestReport")) + } + } + + private fun configureJacoco(project: Project) { + project.tasks.withType(JacocoReport::class).configureEach { + dependsOn(project.tasks.withType(Test::class.java)) + reports { + xml.required.set(true) + html.required.set(true) + csv.required.set(false) + } + } + } + + private fun hasMinestomDependency(project: Project): Boolean { + return project.configurations.any { config -> + config.dependencies.any { dep -> + dep.name.contains("minestom", ignoreCase = true) + } + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index fc7adc9..39a44da 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,7 @@ rootProject.name = "lasius" dependencyResolutionManagement { repositories { mavenCentral() + gradlePluginPortal() } versionCatalogs { @@ -16,4 +17,5 @@ dependencyResolutionManagement { } } -include("lasius-java") \ No newline at end of file +include("lasius-java") +include("lasius-kotlin") \ No newline at end of file From d1fe350d3e6a91c08687027b7c740c84e44a8739 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Thu, 30 Oct 2025 12:58:14 +0100 Subject: [PATCH 2/6] feat(module): add base module to share logic between modules --- .../lasius/LasiusBasePlugin.java | 93 +++++++++++++++ lasius-java/build.gradle.kts | 1 + .../lasius/LasiusJavaPlugin.java | 108 +----------------- lasius-kotlin/build.gradle.kts | 1 + .../lasius/LasiusKotlinPlugin.kt | 64 +---------- 5 files changed, 97 insertions(+), 170 deletions(-) create mode 100644 lasius-base/src/main/java/net/onelitefeather/lasius/LasiusBasePlugin.java diff --git a/lasius-base/src/main/java/net/onelitefeather/lasius/LasiusBasePlugin.java b/lasius-base/src/main/java/net/onelitefeather/lasius/LasiusBasePlugin.java new file mode 100644 index 0000000..8e97700 --- /dev/null +++ b/lasius-base/src/main/java/net/onelitefeather/lasius/LasiusBasePlugin.java @@ -0,0 +1,93 @@ +package net.onelitefeather.lasius; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.publish.PublishingExtension; +import org.gradle.api.publish.maven.MavenPublication; +import org.gradle.api.tasks.testing.Test; +import org.gradle.api.tasks.testing.logging.TestLogEvent; +import org.gradle.testing.jacoco.tasks.JacocoReport; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * Shared base Gradle plugin that configures common behavior for both Java and Kotlin projects. + */ +public abstract class LasiusBasePlugin implements Plugin<@NotNull Project> { + + @Override + public void apply(@NotNull Project project) { + applyCommonPlugins(project); + configureTesting(project); + configurePublishing(project); + } + + private void applyCommonPlugins(@NotNull Project project) { + project.getPluginManager().apply("jacoco"); + project.getPluginManager().apply("maven-publish"); + } + + /** + * Configures JUnit 5, Jacoco, and test logging. + */ + private void configureTesting(@NotNull Project project) { + project.getTasks().withType(Test.class).configureEach(test -> { + test.useJUnitPlatform(); + test.getTestLogging().setEvents(Set.of( + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.FAILED + )); + test.finalizedBy(project.getTasks().named("jacocoTestReport")); + }); + + project.getTasks().withType(JacocoReport.class).configureEach(jacoco -> { + jacoco.dependsOn(project.getTasks().withType(Test.class)); + jacoco.getReports().getXml().getRequired().set(true); + jacoco.getReports().getHtml().getRequired().set(true); + jacoco.getReports().getCsv().getRequired().set(false); + }); + } + + /** + * Configures Maven publishing with credentials and repository selection based on version. + */ + private void configurePublishing(@NotNull Project project) { + project.afterEvaluate(p -> { + var publishing = p.getExtensions().findByType(PublishingExtension.class); + if (publishing == null) { + return; + } + + publishing.publications(publications -> + publications.create("maven", MavenPublication.class, publication -> { + var component = p.getComponents().findByName("java"); + if (component != null) { + publication.from(component); + } + }) + ); + + publishing.repositories(repos -> repos.maven(maven -> { + String version = p.getVersion().toString(); + String baseUrl = version.contains("SNAPSHOT") + ? "https://repo.onelitefeather.dev/onelitefeather-snapshots" + : "https://repo.onelitefeather.dev/onelitefeather-releases"; + + maven.setName("OneLiteFeatherRepository"); + maven.setUrl(p.uri(baseUrl)); + + String username = System.getenv("ONELITEFEATHER_MAVEN_USERNAME"); + String password = System.getenv("ONELITEFEATHER_MAVEN_PASSWORD"); + + maven.credentials(passwordCredentials -> { + passwordCredentials.setUsername(username); + passwordCredentials.setPassword(password); + }); + })); + + project.getLogger().lifecycle("Configured publishing for {}", project.getName()); + }); + } +} diff --git a/lasius-java/build.gradle.kts b/lasius-java/build.gradle.kts index 54d6a20..c9b97dc 100644 --- a/lasius-java/build.gradle.kts +++ b/lasius-java/build.gradle.kts @@ -5,6 +5,7 @@ plugins { version = "1.0-SNAPSHOT" dependencies { + implementation(project(":lasius-base")) testImplementation(platform(libs.junit.bom)) testImplementation(libs.junit.jupiter) testRuntimeOnly(libs.junit.launcher) diff --git a/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java b/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java index d983898..c5c2150 100644 --- a/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java +++ b/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java @@ -1,34 +1,15 @@ package net.onelitefeather.lasius; -import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.plugins.JavaPluginExtension; -import org.gradle.api.publish.PublishingExtension; -import org.gradle.api.publish.maven.MavenPublication; -import org.gradle.api.tasks.compile.JavaCompile; -import org.gradle.api.tasks.testing.Test; -import org.gradle.api.tasks.testing.logging.TestLogEvent; import org.gradle.jvm.toolchain.JavaLanguageVersion; -import org.gradle.testing.jacoco.plugins.JacocoPlugin; -import org.gradle.testing.jacoco.tasks.JacocoReport; import org.jetbrains.annotations.NotNull; -import java.nio.charset.StandardCharsets; - -public class LasiusJavaPlugin implements Plugin<@NotNull Project> { +public class LasiusJavaPlugin extends LasiusBasePlugin { @Override public void apply(@NotNull Project project) { - applyPlugins(project); configureJava(project); - configureTasks(project); - configurePublishing(project); - } - - private void applyPlugins(@NotNull Project project) { - project.getPluginManager().apply("java-library"); - project.getPluginManager().apply("maven-publish"); - project.getPluginManager().apply(JacocoPlugin.class); } private void configureJava(@NotNull Project project) { @@ -41,91 +22,4 @@ private void configureJava(@NotNull Project project) { project.getLogger().lifecycle("Set Java toolchain to Java {} for project {}", 25, project.getName()); }); } - - /** - * Configures tasks for the project. - * @param project the project to configure tasks for - */ - private void configureTasks(@NotNull Project project) { - project.getTasks().withType(JavaCompile.class).configureEach(compileTask -> { - compileTask.getOptions().setEncoding(StandardCharsets.UTF_8.displayName()); - compileTask.getOptions().getRelease().set(25); - }); - - project.getTasks().withType(Test.class).configureEach(testTask -> { - testTask.useJUnitPlatform(); - if (hasMinestomDependency(project)) { - testTask.jvmArgs("-Dminestom.inside-test=true"); - } - - testTask.getTestLogging().setEvents(java.util.Set.of( - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.FAILED - )); - - testTask.finalizedBy(project.getTasks().named("jacocoTestReport")); - }); - - project.getTasks().withType(JacocoReport.class).configureEach(jacocoTask -> { - jacocoTask.dependsOn(project.getTasks().withType(Test.class)); - jacocoTask.getReports().getXml().getRequired().set(true); - jacocoTask.getReports().getCsv().getRequired().set(true); - }); - } - - - /** - * Configures publishing for the project. - * - * @param project the project to configure publishing for. - */ - private void configurePublishing(@NotNull Project project) { - project.getPluginManager().apply("maven-publish"); - - project.afterEvaluate(p -> { - var publishing = p.getExtensions().findByType(PublishingExtension.class); - if (publishing == null) return; - - publishing.publications(publications -> - publications.create("maven", MavenPublication.class, publication -> - publication.from(p.getComponents().getByName("java")) - ) - ); - - publishing.repositories(repos -> repos.maven(maven -> { - maven.setName("OneLiteFeatherRepository"); - - String username = System.getenv("ONELITEFEATHER_MAVEN_USERNAME"); - String password = System.getenv("ONELITEFEATHER_MAVEN_PASSWORD"); - - maven.credentials(passwordCredentials -> { - passwordCredentials.setUsername(username); - passwordCredentials.setPassword(password); - }); - - String version = p.getVersion().toString(); - String url = version.contains("SNAPSHOT") - ? "https://repo.onelitefeather.dev/onelitefeather-snapshots" - : "https://repo.onelitefeather.dev/onelitefeather-releases"; - - maven.setUrl(p.uri(url)); - })); - - project.getLogger().lifecycle("Configured publishing for {}", project.getName()); - }); - } - - /** - * Checks if the project has a dependency on Minestom. - * - * @param project the project to check - * @return true if the project has a dependency on Minestom, false otherwise - */ - private boolean hasMinestomDependency(@NotNull Project project) { - return project.getConfigurations().stream() - .anyMatch(config -> config.getDependencies().stream() - .anyMatch(dep -> dep.getName().toLowerCase().contains("minestom"))); - } } - diff --git a/lasius-kotlin/build.gradle.kts b/lasius-kotlin/build.gradle.kts index 1714e44..3a12f4c 100644 --- a/lasius-kotlin/build.gradle.kts +++ b/lasius-kotlin/build.gradle.kts @@ -3,6 +3,7 @@ plugins { } dependencies { + implementation(project(":lasius-base")) // Needed because your plugin applies and configures the Kotlin plugin implementation("org.jetbrains.kotlin:kotlin-gradle-plugin") testImplementation(platform(libs.junit.bom)) diff --git a/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt b/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt index 9f2a6e2..bbc148c 100644 --- a/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt +++ b/lasius-kotlin/src/main/kotlin/net/onelitefeather/lasius/LasiusKotlinPlugin.kt @@ -1,29 +1,12 @@ package net.onelitefeather.lasius -import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.tasks.compile.JavaCompile -import org.gradle.api.tasks.testing.Test -import org.gradle.api.tasks.testing.logging.TestLogEvent import org.gradle.kotlin.dsl.findByType -import org.gradle.kotlin.dsl.withType -import org.gradle.testing.jacoco.plugins.JacocoPlugin -import org.gradle.testing.jacoco.tasks.JacocoReport import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension -import java.nio.charset.StandardCharsets -class LasiusKotlinPlugin : Plugin { +class LasiusKotlinPlugin : LasiusBasePlugin() { override fun apply(project: Project) { - applyPlugins(project) configureKotlin(project) - configureJavaCompile(project) - configureTests(project) - configureJacoco(project) - } - - private fun applyPlugins(project: Project) { - project.pluginManager.apply("org.jetbrains.kotlin.jvm") - project.pluginManager.apply(JacocoPlugin::class.java) } private fun configureKotlin(project: Project) { @@ -32,49 +15,4 @@ class LasiusKotlinPlugin : Plugin { project.logger.lifecycle("Configured Kotlin JVM toolchain to Java 21 for ${project.name}") } } - - private fun configureJavaCompile(project: Project) { - project.tasks.withType(JavaCompile::class).configureEach { - options.encoding = StandardCharsets.UTF_8.displayName() - options.release.set(21) - } - } - - private fun configureTests(project: Project) { - project.tasks.withType(Test::class).configureEach { - useJUnitPlatform() - if (hasMinestomDependency(project)) { - jvmArgs("-Dminestom.inside-test=true") - } - - testLogging { - events = setOf( - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.FAILED - ) - } - - finalizedBy(project.tasks.named("jacocoTestReport")) - } - } - - private fun configureJacoco(project: Project) { - project.tasks.withType(JacocoReport::class).configureEach { - dependsOn(project.tasks.withType(Test::class.java)) - reports { - xml.required.set(true) - html.required.set(true) - csv.required.set(false) - } - } - } - - private fun hasMinestomDependency(project: Project): Boolean { - return project.configurations.any { config -> - config.dependencies.any { dep -> - dep.name.contains("minestom", ignoreCase = true) - } - } - } } From f15c5248c996bd56b30bc8cfe6e4609184538733 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Thu, 30 Oct 2025 12:58:29 +0100 Subject: [PATCH 3/6] feat(module): add the kotlin gralde plugin module --- settings.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 39a44da..8807c8f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,4 +18,5 @@ dependencyResolutionManagement { } include("lasius-java") -include("lasius-kotlin") \ No newline at end of file +include("lasius-kotlin") +include("lasius-base") \ No newline at end of file From d2c1f44053e20c8870c0d717eb5647d954547525 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Thu, 30 Oct 2025 12:58:45 +0100 Subject: [PATCH 4/6] feat(build): add missing plugin apply --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6d51c76..dc8a23c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ subprojects { apply(plugin = "maven-publish") - + apply(plugin = "java-library") group = "net.onelitefeather" plugins.withType { From 132424b58cc6405782a2dd7d556caeaa74da3a8b Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Mon, 3 Nov 2025 17:34:17 +0100 Subject: [PATCH 5/6] fix(build): add missing build.gradle.kts file --- lasius-base/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 lasius-base/build.gradle.kts diff --git a/lasius-base/build.gradle.kts b/lasius-base/build.gradle.kts new file mode 100644 index 0000000..3ae4f84 --- /dev/null +++ b/lasius-base/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + `java-gradle-plugin` +} + From 7d4f8d99e4d7b72d68367edd7b0a58c36fa3980b Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Mon, 3 Nov 2025 17:50:02 +0100 Subject: [PATCH 6/6] fix(tests): improve plugin apply to fix test execution --- .../java/net/onelitefeather/lasius/LasiusJavaPlugin.java | 9 ++++++++- .../net/onelitefeather/lasius/LasiusJavaPluginTest.java | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java b/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java index c5c2150..b4280d3 100644 --- a/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java +++ b/lasius-java/src/main/java/net/onelitefeather/lasius/LasiusJavaPlugin.java @@ -2,6 +2,7 @@ import org.gradle.api.Project; import org.gradle.api.plugins.JavaPluginExtension; +import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.jvm.toolchain.JavaLanguageVersion; import org.jetbrains.annotations.NotNull; @@ -9,16 +10,22 @@ public class LasiusJavaPlugin extends LasiusBasePlugin { @Override public void apply(@NotNull Project project) { + super.apply(project); configureJava(project); } private void configureJava(@NotNull Project project) { - project.getPluginManager().withPlugin("java", java -> { + project.getPluginManager().withPlugin("java-library", _ -> { var javaExt = project.getExtensions().getByType(JavaPluginExtension.class); javaExt.getToolchain().getLanguageVersion().set(JavaLanguageVersion.of(25)); javaExt.withJavadocJar(); javaExt.withSourcesJar(); + project.getTasks().withType(JavaCompile.class).configureEach(task -> { + task.getOptions().setEncoding("UTF-8"); + task.getOptions().getRelease().set(25); + }); + project.getLogger().lifecycle("Set Java toolchain to Java {} for project {}", 25, project.getName()); }); } diff --git a/lasius-java/src/test/java/net/onelitefeather/lasius/LasiusJavaPluginTest.java b/lasius-java/src/test/java/net/onelitefeather/lasius/LasiusJavaPluginTest.java index 8e57102..260e1b3 100644 --- a/lasius-java/src/test/java/net/onelitefeather/lasius/LasiusJavaPluginTest.java +++ b/lasius-java/src/test/java/net/onelitefeather/lasius/LasiusJavaPluginTest.java @@ -17,6 +17,7 @@ class LasiusJavaPluginTest { @BeforeEach void setUp() { this.project = ProjectBuilder.builder().build(); + project.getPluginManager().apply("java-library"); } @Test