diff --git a/nebula-archrules-gradle-plugin/gradle.lockfile b/nebula-archrules-gradle-plugin/gradle.lockfile index de67e1d..38231c3 100644 --- a/nebula-archrules-gradle-plugin/gradle.lockfile +++ b/nebula-archrules-gradle-plugin/gradle.lockfile @@ -2,53 +2,58 @@ # Manual edits can break the build and are not advised. # This file is expected to be part of source control. cglib:cglib-nodep:3.2.2=integTestRuntimeClasspath,testRuntimeClasspath -com.fasterxml.jackson.core:jackson-annotations:2.20=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -com.jayway.jsonpath:json-path:2.9.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -com.netflix.nebula:nebula-test:11.7.1=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -com.tngtech.archunit:archunit:1.4.1=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy:1.17.7=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -net.javacrumbs.json-unit:json-unit-assertj:5.0.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -net.javacrumbs.json-unit:json-unit-core:5.0.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -net.javacrumbs.json-unit:json-unit-json-path:5.0.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-annotations:2.20=compileClasspath,implementationDependenciesMetadata,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.jayway.jsonpath:json-path:2.9.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.netflix.nebula:nebula-test:11.8.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.tngtech.archunit:archunit:1.4.1=compileClasspath,implementationDependenciesMetadata,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +io.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation +net.bytebuddy:byte-buddy:1.17.7=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +net.javacrumbs.json-unit:json-unit-assertj:5.0.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +net.javacrumbs.json-unit:json-unit-core:5.0.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +net.javacrumbs.json-unit:json-unit-json-path:5.0.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath net.minidev:accessors-smart:2.5.0=integTestRuntimeClasspath,testRuntimeClasspath net.minidev:json-smart:2.5.0=integTestRuntimeClasspath,testRuntimeClasspath -org.apiguardian:apiguardian-api:1.1.2=integTestCompileClasspath,testCompileClasspath -org.assertj:assertj-core:3.27.6=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hamcrest:hamcrest-core:3.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.hamcrest:hamcrest:3.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apiguardian:apiguardian-api:1.1.2=integTestCompileClasspath,integTestImplementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata +org.assertj:assertj-core:3.27.6=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.hamcrest:hamcrest-core:3.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.hamcrest:hamcrest:3.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jetbrains.kotlin:abi-tools-api:2.2.0=kotlinInternalAbiValidation +org.jetbrains.kotlin:abi-tools:2.2.0=kotlinInternalAbiValidation org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:2.2.0=kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest org.jetbrains.kotlin:kotlin-build-tools-api:2.2.0=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-build-tools-impl:2.2.0=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-compiler-runner:2.2.0=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-daemon-client:2.2.0=kotlinBuildToolsApiClasspath -org.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath -org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath -org.jetbrains.kotlin:kotlin-reflect:2.2.0=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.0=kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-metadata-jvm:2.2.0=kotlinInternalAbiValidation +org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-reflect:2.2.0=compileClasspath,compileOnlyDependenciesMetadata,embeddedKotlin,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:2.2.0=kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest -org.jetbrains.kotlin:kotlin-script-runtime:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest -org.jetbrains.kotlin:kotlin-scripting-common:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest -org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest -org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest -org.jetbrains.kotlin:kotlin-scripting-jvm:2.2.0=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest -org.jetbrains.kotlin:kotlin-stdlib:2.2.0=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath -org.jetbrains:annotations:13.0=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath -org.json:json:20250517=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.jspecify:jspecify:1.0.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-api:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-script-runtime:2.2.0=compilePluginsBlocksPluginClasspathElements,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-scripting-common:2.2.0=compilePluginsBlocksPluginClasspathElements,kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest +org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.0=compilePluginsBlocksPluginClasspathElements,kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest +org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.0=compilePluginsBlocksPluginClasspathElements,kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest +org.jetbrains.kotlin:kotlin-scripting-jvm:2.2.0=compilePluginsBlocksPluginClasspathElements,kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest +org.jetbrains.kotlin:kotlin-stdlib:2.2.0=compileClasspath,compileOnlyDependenciesMetadata,compilePluginsBlocksPluginClasspathElements,embeddedKotlin,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath +org.jetbrains:annotations:13.0=compileClasspath,compilePluginsBlocksPluginClasspathElements,embeddedKotlin,integTestCompileClasspath,integTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathIntegTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,testCompileClasspath,testRuntimeClasspath +org.json:json:20250517=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jspecify:jspecify:1.0.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.junit.jupiter:junit-jupiter-engine:5.14.0=integTestRuntimeClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-launcher:1.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit:junit-bom:5.14.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit:junit-bom:5.14.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.objenesis:objenesis:2.4=integTestRuntimeClasspath,testRuntimeClasspath -org.opentest4j:opentest4j:1.3.0=integTestCompileClasspath,integTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.ow2.asm:asm:9.3=integTestRuntimeClasspath,testRuntimeClasspath -org.slf4j:slf4j-api:2.0.17=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -tools.jackson.core:jackson-core:3.0.2=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -tools.jackson.core:jackson-databind:3.0.2=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -tools.jackson:jackson-bom:3.0.2=compileClasspath,integTestCompileClasspath,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -empty=annotationProcessor,integTestAnnotationProcessor,integTestKotlinScriptDefExtensions,kotlinScriptDefExtensions,testAnnotationProcessor,testKotlinScriptDefExtensions +org.slf4j:slf4j-api:2.0.17=compileClasspath,implementationDependenciesMetadata,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +tools.jackson.core:jackson-core:3.0.2=compileClasspath,implementationDependenciesMetadata,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +tools.jackson.core:jackson-databind:3.0.2=compileClasspath,implementationDependenciesMetadata,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +tools.jackson:jackson-bom:3.0.2=compileClasspath,implementationDependenciesMetadata,integTestCompileClasspath,integTestImplementationDependenciesMetadata,integTestRuntimeClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +empty=annotationProcessor,apiDependenciesMetadata,integTestAnnotationProcessor,integTestApiDependenciesMetadata,integTestCompileOnlyDependenciesMetadata,integTestIntransitiveDependenciesMetadata,integTestKotlinScriptDefExtensions,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt index 38023b9..5610d42 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt @@ -3,18 +3,22 @@ package com.netflix.nebula.archrules.gradle import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.ARCH_RULES import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.artifacts.type.ArtifactTypeDefinition import org.gradle.api.component.AdhocComponentWithVariants +import org.gradle.api.internal.artifacts.dsl.LazyPublishArtifact import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.plugins.internal.DefaultJavaFeatureSpec import org.gradle.api.plugins.internal.JavaConfigurationVariantMapping import org.gradle.api.plugins.jvm.JvmTestSuite +import org.gradle.api.plugins.jvm.internal.JvmLanguageUtilities +import org.gradle.api.plugins.jvm.internal.JvmPluginServices import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.TaskProvider +import org.gradle.api.tasks.bundling.Jar +import org.gradle.api.tasks.compile.JavaCompile import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal -import org.gradle.kotlin.dsl.getByType -import org.gradle.kotlin.dsl.invoke -import org.gradle.kotlin.dsl.named -import org.gradle.kotlin.dsl.withType +import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.support.serviceOf import org.gradle.testing.base.TestingExtension class ArchrulesLibraryPlugin : Plugin { @@ -27,18 +31,13 @@ class ArchrulesLibraryPlugin : Plugin { archRulesSourceSet.implementationConfigurationName, "com.netflix.nebula:nebula-archrules-core:$version" ) - registerRuntimeFeatureForSourceSet(project, archRulesSourceSet) - project.configurations.named("archRulesRuntimeElements") { - attributes { - attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(ARCH_RULES)) - } - } - project.configurations.named("archRulesApiElements") { - attributes { - attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(ARCH_RULES)) - } + val jarTask = project.tasks.register("archRulesJar") { + description = "Assembles a jar archive containing the classes of the arch rules." + group = "build" + from(archRulesSourceSet.output) + archiveClassifier.set("arch-rules") } - + registerRuntimeFeatureForSourceSet(project, archRulesSourceSet, jarTask) project.pluginManager.withPlugin("jvm-test-suite") { val ext = project.extensions.getByType() ext.suites { @@ -61,21 +60,42 @@ class ArchrulesLibraryPlugin : Plugin { /** * Stripped-down version of DefaultJavaPluginExtension.registerFeature which only registers runtime elements */ - fun registerRuntimeFeatureForSourceSet(project: Project, sourceSet: SourceSet) { - val spec = DefaultJavaFeatureSpec("archRules", project as ProjectInternal) - spec.usingSourceSet(sourceSet) - spec.capability(project.group.toString(), project.name, project.version.toString()) - val feature = spec.create() + fun registerRuntimeFeatureForSourceSet(project: Project, sourceSet: SourceSet, jarTask: TaskProvider) { val component = project.components.withType().firstOrNull() if (component != null) { - component.features.add(feature) - val adhocComponent = component as AdhocComponentWithVariants - if (spec.isPublished) { - adhocComponent.addVariantsFromConfiguration( - project.configurations.getByName("archRulesRuntimeElements"), - JavaConfigurationVariantMapping("runtime", true, feature.runtimeClasspathConfiguration) + val compileJava = project.tasks.named(sourceSet.compileJavaTaskName) + val jvmPluginServices = project.serviceOf() + val jvmLanguageUtilities = project.serviceOf() + + val projectInternal = project as ProjectInternal + val jarArtifact = LazyPublishArtifact( + jarTask, + projectInternal.fileResolver, + projectInternal.taskDependencyFactory + ) + + project.configurations.consumable("archRulesRuntimeElements") { + jvmLanguageUtilities.useDefaultTargetPlatformInference(this, compileJava) + jvmPluginServices.configureAsRuntimeElements(this) + + extendsFrom( + project.configurations.getByName(sourceSet.implementationConfigurationName), + project.configurations.getByName(sourceSet.runtimeOnlyConfigurationName) ) + outgoing.artifacts.add(jarArtifact); + attributes { + attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(ARCH_RULES)) + attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE) + } } + val adhocComponent = component as AdhocComponentWithVariants + adhocComponent.addVariantsFromConfiguration( + project.configurations.getByName("archRulesRuntimeElements"), + JavaConfigurationVariantMapping( + "runtime", true, + project.configurations.getByName("archRulesRuntimeClasspath") + ) + ) } } } diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt index 9dcbd52..500437d 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt @@ -18,6 +18,8 @@ class ArchrulesRunnerPlugin : Plugin { val archRulesReportDir = project.layout.buildDirectory.dir("reports/archrules") project.plugins.withId("java") { project.configurations.register("archRules") { + isCanBeConsumed = false + isCanBeResolved = true attributes { attribute( ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt index 6db4299..cd93236 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt @@ -88,7 +88,7 @@ class ArchrulesLibraryPluginTest { .exists() val moduleMetadataJson = moduleMetadata.readText() -println(moduleMetadataJson) + println(moduleMetadataJson) assertThatJson(moduleMetadataJson) .inPath("$.variants[?(@.name=='runtimeElements')].files[0]") .isArray @@ -108,6 +108,46 @@ println(moduleMetadataJson) .containsEntry("name", "library-with-rules-0.0.1-arch-rules.jar") } + @Test + fun `plugin produces proper outgoingVariants`() { + val runner = testProject(projectDir) { + properties { + gradleCache(true) + } + settings { + name("library-with-rules") + } + rootProject { + group("com.example") + // a library that contains production code and rules to go along with it + plugins { + id("java-library") + id("com.netflix.nebula.archrules.library") + id("maven-publish") + } + repositories { + maven("https://netflixoss.jfrog.io/artifactory/gradle-plugins") + mavenCentral() + } + declareMavenPublication() + src { + main { + exampleLibraryClass() + } + sourceSet("archRules") { + exampleDeprecatedArchRule() + } + } + } + } + + val result = runner.run("outgoingVariants", "-Pversion=0.0.1") + assertThat(result.output) + .contains("Variant archRulesRuntimeElements") + .contains("Variant testResultsElementsForArchRulesTest") + .doesNotContain("Variant archRulesApiElements") + } + @Test fun `plugin sets up tests for rules`() { val runner = testProject(projectDir) { diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt index ab291fc..7880dd7 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/IntegrationTest.kt @@ -87,4 +87,150 @@ internal class IntegrationTest { assertThat(reportsDir.exists()) assertThat(reportsDir.resolve("main.data")).exists().isNotEmpty } + + @ParameterizedTest + @EnumSource(SupportedGradleVersion::class) + fun `test variant resolution`(gradleVersion: SupportedGradleVersion) { + val runner = testProject(projectDir) { + properties { + gradleCache(true) + } + subProject("library-with-rules") { + // a library that contains production code and rules to go along with it + plugins { + id("java-library") + id("com.netflix.nebula.archrules.library") + kotlin("jvm") version ("2.2.20") + } + repositories { + maven("https://netflixoss.jfrog.io/artifactory/gradle-plugins") + mavenCentral() + } + src { + main { + exampleLibraryClass() + } + sourceSet("archRules") { + exampleDeprecatedArchRule() + } + } + } + subProject("code-to-check") { + // a project which consumes libraries which should have the rules evaluated against it + plugins { + id("java") + id("com.netflix.nebula.archrules.runner") + } + repositories { + mavenCentral() + } + dependencies( + """implementation(project(":library-with-rules"))""" + ) + src { + main { + exampleDeprecatedUsage() + } + } + } + } + + val serviceFile = projectDir + .resolve("library-with-rules/src/archRules/resources/META-INF/services/com.netflix.nebula.archrules.core.ArchRulesService") + serviceFile.parentFile.mkdirs() + serviceFile.writeText("com.example.library.LibraryArchRules") + + val result = runner.run("check", "--stacktrace") { + withGradleVersion(gradleVersion.version) + forwardOutput() + } + + assertThat(result.task(":library-with-rules:check")) + .hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.UP_TO_DATE) + + assertThat(result.task(":code-to-check:checkArchRulesMain")) + .`as`("archRules run for main source set") + .hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) + + assertThat(result.task(":code-to-check:checkArchRulesTest")) + .`as`("archRules run for test source set") + .hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) + + assertThat(result.task(":code-to-check:check")) + .hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.UP_TO_DATE) + assertThat(result) + .hasNoMutableStateWarnings() + .hasNoDeprecationWarnings() + + val reportsDir = projectDir.resolve("code-to-check/build/reports/archrules") + + assertThat(reportsDir.exists()) + assertThat(reportsDir.resolve("main.data")).exists().isNotEmpty + } + + + @ParameterizedTest + @EnumSource(SupportedGradleVersion::class) + fun `test normal projects can consume libraries with rules`(gradleVersion: SupportedGradleVersion) { + val runner = testProject(projectDir) { + properties { + gradleCache(true) + } + subProject("library-with-rules") { + // a library that contains production code and rules to go along with it + plugins { + id("java-library") + id("com.netflix.nebula.archrules.library") + kotlin("jvm") version ("2.2.20") + } + repositories { + mavenCentral() + } + src { + main { + exampleLibraryClass() + } + sourceSet("archRules") { + exampleDeprecatedArchRule() + } + } + } + subProject("code-to-check") { + // a project which consumes libraries which should have the rules evaluated against it + plugins { + id("java") + } + repositories { + mavenCentral() + } + dependencies( + """implementation(project(":library-with-rules"))""" + ) + src { + main { + exampleDeprecatedUsage() + } + } + } + } + + val serviceFile = projectDir + .resolve("library-with-rules/src/archRules/resources/META-INF/services/com.netflix.nebula.archrules.core.ArchRulesService") + serviceFile.parentFile.mkdirs() + serviceFile.writeText("com.example.library.LibraryArchRules") + + val result = runner.run("check", "--stacktrace") { + withGradleVersion(gradleVersion.version) + forwardOutput() + } + + assertThat(result.task(":library-with-rules:check")) + .hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.UP_TO_DATE) + + assertThat(result.task(":code-to-check:check")) + .hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.UP_TO_DATE) + assertThat(result) + .hasNoMutableStateWarnings() + .hasNoDeprecationWarnings() + } } \ No newline at end of file