Skip to content

Commit c7a736b

Browse files
committed
archRules should produce only runtime elements (not api)
this avoids variant selection confusion in consumers
1 parent 38741bc commit c7a736b

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed

nebula-archrules-gradle-plugin/gradle.lockfile

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ net.javacrumbs.json-unit:json-unit-core:5.0.0=integTestCompileClasspath,integTes
1212
net.javacrumbs.json-unit:json-unit-json-path:5.0.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
1313
net.minidev:accessors-smart:2.5.0=integTestRuntimeClasspath,testRuntimeClasspath
1414
net.minidev:json-smart:2.5.0=integTestRuntimeClasspath,testRuntimeClasspath
15-
org.apiguardian:apiguardian-api:1.1.2=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
15+
org.apiguardian:apiguardian-api:1.1.2=integTestCompileClasspath,testCompileClasspath
1616
org.assertj:assertj-core:3.27.6=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
1717
org.hamcrest:hamcrest-core:3.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
1818
org.hamcrest:hamcrest:3.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
@@ -36,17 +36,19 @@ org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClass
3636
org.jetbrains:annotations:13.0=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
3737
org.json:json:20250517=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
3838
org.jspecify:jspecify:1.0.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
39-
org.junit.jupiter:junit-jupiter-api:5.12.2=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
40-
org.junit.jupiter:junit-jupiter-engine:5.12.2=integTestRuntimeClasspath,testRuntimeClasspath
41-
org.junit.jupiter:junit-jupiter-params:5.12.2=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
42-
org.junit.jupiter:junit-jupiter:5.12.2=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
39+
org.junit.jupiter:junit-jupiter-api:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
40+
org.junit.jupiter:junit-jupiter-engine:5.14.0=integTestRuntimeClasspath,testRuntimeClasspath
41+
org.junit.jupiter:junit-jupiter-params:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
42+
org.junit.jupiter:junit-jupiter:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4343
org.junit.platform:junit-platform-commons:1.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4444
org.junit.platform:junit-platform-engine:1.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4545
org.junit.platform:junit-platform-launcher:1.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
46+
org.junit:junit-bom:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4647
org.objenesis:objenesis:2.4=integTestRuntimeClasspath,testRuntimeClasspath
4748
org.opentest4j:opentest4j:1.3.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4849
org.ow2.asm:asm:9.3=integTestRuntimeClasspath,testRuntimeClasspath
4950
org.slf4j:slf4j-api:2.0.17=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
5051
tools.jackson.core:jackson-core:3.0.2=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
5152
tools.jackson.core:jackson-databind:3.0.2=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
53+
tools.jackson:jackson-bom:3.0.2=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
5254
empty=annotationProcessor,integTestAnnotationProcessor,integTestKotlinScriptDefExtensions,kotlinScriptDefExtensions,testAnnotationProcessor,testKotlinScriptDefExtensions

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ package com.netflix.nebula.archrules.gradle
33
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.ARCH_RULES
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
6+
import org.gradle.api.component.AdhocComponentWithVariants
7+
import org.gradle.api.internal.project.ProjectInternal
68
import org.gradle.api.plugins.JavaPluginExtension
9+
import org.gradle.api.plugins.internal.DefaultJavaFeatureSpec
10+
import org.gradle.api.plugins.internal.JavaConfigurationVariantMapping
711
import org.gradle.api.plugins.jvm.JvmTestSuite
12+
import org.gradle.api.tasks.SourceSet
13+
import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal
814
import org.gradle.kotlin.dsl.getByType
915
import org.gradle.kotlin.dsl.invoke
1016
import org.gradle.kotlin.dsl.named
17+
import org.gradle.kotlin.dsl.withType
1118
import org.gradle.testing.base.TestingExtension
1219

1320
class ArchrulesLibraryPlugin : Plugin<Project> {
@@ -20,10 +27,7 @@ class ArchrulesLibraryPlugin : Plugin<Project> {
2027
archRulesSourceSet.implementationConfigurationName,
2128
"com.netflix.nebula:nebula-archrules-core:$version"
2229
)
23-
ext.registerFeature("archRules") {
24-
usingSourceSet(archRulesSourceSet)
25-
capability(project.group.toString(), project.name, project.version.toString())
26-
}
30+
registerRuntimeFeatureForSourceSet(project, archRulesSourceSet)
2731
project.configurations.named("archRulesRuntimeElements") {
2832
attributes {
2933
attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(ARCH_RULES))
@@ -53,4 +57,25 @@ class ArchrulesLibraryPlugin : Plugin<Project> {
5357
}
5458
}
5559
}
60+
61+
/**
62+
* Stripped-down version of DefaultJavaPluginExtension.registerFeature which only registers runtime elements
63+
*/
64+
fun registerRuntimeFeatureForSourceSet(project: Project, sourceSet: SourceSet) {
65+
val spec = DefaultJavaFeatureSpec("archRules", project as ProjectInternal)
66+
spec.usingSourceSet(sourceSet)
67+
spec.capability(project.group.toString(), project.name, project.version.toString())
68+
val feature = spec.create()
69+
val component = project.components.withType<JvmSoftwareComponentInternal>().firstOrNull()
70+
if (component != null) {
71+
component.features.add(feature)
72+
val adhocComponent = component as AdhocComponentWithVariants
73+
if (spec.isPublished) {
74+
adhocComponent.addVariantsFromConfiguration(
75+
project.configurations.getByName("archRulesRuntimeElements"),
76+
JavaConfigurationVariantMapping("runtime", true, feature.runtimeClasspathConfiguration)
77+
)
78+
}
79+
}
80+
}
5681
}

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ println(moduleMetadataJson)
9595
.first().isObject
9696
.containsEntry("name", "library-with-rules-0.0.1.jar")
9797

98+
assertThatJson(moduleMetadataJson)
99+
.inPath("$.variants[?(@.name=='archRulesApiElements')].files[0]")
100+
.`as`("apiElements is not produced for archRules")
101+
.isArray()
102+
.isEmpty()
103+
98104
assertThatJson(moduleMetadataJson)
99105
.inPath("$.variants[?(@.name=='archRulesRuntimeElements')].files[0]")
100106
.isArray

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ internal class IntegrationTest {
6060
serviceFile.parentFile.mkdirs()
6161
serviceFile.writeText("com.example.library.LibraryArchRules")
6262

63-
val result = runner.run("check") {
63+
val result = runner.run("check", "--stacktrace") {
6464
withGradleVersion(gradleVersion.version)
6565
forwardOutput()
6666
}

0 commit comments

Comments
 (0)