1- plugins {
2- id(" gradlexbuild.module-mappings" )
3- id(" org.gradlex.internal.plugin-publish-conventions" ) version " 0.6"
4- }
1+ import org.gradle.api.internal.project.ProjectInternal
2+ import org.gradle.util.internal.VersionNumber
3+ import java.util.Properties
54
6- group = " org.gradlex"
75version = " 1.11"
86
9- java {
10- toolchain.languageVersion = JavaLanguageVersion .of(17 )
11- }
12-
13- tasks.compileJava {
14- options.release = 8
15- }
16-
17- tasks.withType<Javadoc >().configureEach {
18- options {
19- this as StandardJavadocDocletOptions
20- encoding = " UTF-8"
21- addStringOption(" Xdoclint:all,-missing" , " -quiet" )
22- addStringOption(" Xwerror" , " -quiet" )
23- }
24- }
25-
267configurations.compileClasspath {
278 // Allow Java 11 dependencies on compile classpath
289 attributes.attribute(TargetJvmVersion .TARGET_JVM_VERSION_ATTRIBUTE , 11 )
2910}
3011
3112dependencies {
3213 implementation(" org.ow2.asm:asm:9.9" )
33-
3414 compileOnly(" org.gradlex:extra-java-module-info:1.13.1" )
3515 compileOnly(" com.autonomousapps:dependency-analysis-gradle-plugin:3.1.0" )
36-
37- testImplementation(" org.assertj:assertj-core:3.27.6" )
38- testImplementation(" org.gradle.exemplar:samples-check:1.0.3" )
39- testRuntimeOnly(" org.junit.vintage:junit-vintage-engine" )
4016}
4117
4218pluginPublishConventions {
4319 id(" ${project.group} .${project.name} " )
4420 implementationClass(" org.gradlex.javamodule.dependencies.JavaModuleDependenciesPlugin" )
4521 displayName(" Java Module Dependencies Gradle Plugin" )
4622 description(" A plugin that makes Gradle respect the dependencies defined in 'module-info.java' files." )
23+ additionalPlugin(" ${project.group} .java-module-versions" ) {
24+ implementationClass(" org.gradlex.javamodule.dependencies.JavaModuleVersionsPlugin" )
25+ displayName(" Java Module Versions Gradle Plugin" )
26+ description(" A plugin that makes Gradle respect the dependencies defined in 'module-info.java' files." )
27+ }
4728 tags(" gradlex" , " java" , " modularity" , " jigsaw" , " jpms" , " dependencies" , " versions" )
4829 gitHub(" https://github.com/gradlex-org/java-module-dependencies" )
4930 developer {
@@ -53,43 +34,78 @@ pluginPublishConventions {
5334 }
5435}
5536
56- gradlePlugin.plugins.register(" java-module-versions" ) {
57- id = " ${project.group} .${name} "
58- implementationClass = " org.gradlex.javamodule.dependencies.JavaModuleVersionsPlugin"
59- displayName = " Java Module Versions Gradle Plugin"
60- description = " A plugin that makes Gradle respect the dependencies defined in 'module-info.java' files."
61- tags = listOf (" gradlex" , " java" , " modularity" , " jigsaw" , " jpms" , " dependencies" , " versions" )
37+ testingConventions { testGradleVersions(" 7.4" , " 7.6.5" , " 8.0.2" , " 8.14.3" ) }
38+
39+ val detachedResolver: ProjectInternal .DetachedResolver = (project as ProjectInternal ).newDetachedResolver()
40+ detachedResolver.repositories.ivy {
41+ name = " Modules Properties Repository"
42+ url = project.uri(" https://raw.githubusercontent.com/sormuras/modules/main/com.github.sormuras.modules" )
43+ metadataSources.artifact()
44+ patternLayout {
45+ artifact(" [organisation]/[module].properties" )
46+ ivy(" [module]/[revision]/ivy.xml" )
47+ setM2compatible(true )
48+ }
49+ }
50+ val modulePropertiesScope = detachedResolver.configurations.dependencyScope(" moduleProperties" )
51+ val modulePropertiesPath = detachedResolver.configurations.resolvable(" modulePropertiesPath" ) {
52+ extendsFrom(modulePropertiesScope.get())
6253}
54+ val dep = detachedResolver.dependencies.add(modulePropertiesScope.name, " com.github.sormuras.modules:modules:1" )
55+ (dep as ExternalModuleDependency ).isChanging = true
6356
64- tasks.test {
65- useJUnitPlatform()
66- maxParallelForks = 4
67- inputs.dir(layout.projectDirectory.dir(" samples" ))
57+ val updateUniqueModulesProperties = tasks.register<UniqueModulesPropertiesUpdate >(" updateUniqueModulesProperties" ) {
58+ skipUpdate.set(providers.environmentVariable(" CI" ).getOrElse(" false" ).toBoolean())
59+ modulesProperties.from(modulePropertiesPath)
60+ uniqueModulesProperties.set(layout.projectDirectory.file(
61+ " src/main/resources/org/gradlex/javamodule/dependencies/unique_modules.properties" )
62+ )
6863}
6964
70- testing.suites.named<JvmTestSuite >(" test" ) {
71- useJUnitJupiter()
72- listOf (" 7.4" , " 7.6.5" , " 8.0.2" , " 8.14.3" ).forEach { gradleVersionUnderTest ->
73- targets.register(" test${gradleVersionUnderTest} " ) {
74- testTask {
75- group = LifecycleBasePlugin .VERIFICATION_GROUP
76- description = " Runs tests against Gradle $gradleVersionUnderTest "
77- systemProperty(" gradleVersionUnderTest" , gradleVersionUnderTest)
78- exclude(" **/*SamplesTest.class" ) // Not yet cross-version ready
79- exclude(" **/initialization/**" ) // Settings plugin only for Gradle 8.8+
80- if (gradleVersionUnderTest == " 7.4" ) {
81- // Configuration cache only "reliable" since 7.6 (?)
82- // https://github.com/gradlex-org/java-module-dependencies/issues/129
83- exclude(" **/configcache/**" )
84- }
85- }
86- }
87- }
88- targets.all {
89- testTask {
90- maxParallelForks = 4
91- inputs.dir(layout.projectDirectory.dir(" samples" ))
92- inputs.dir(" samples" )
65+ sourceSets.main {
66+ resources.setSrcDirs(listOf (updateUniqueModulesProperties.map {
67+ it.uniqueModulesProperties.get().asFile.parentFile.parentFile.parentFile.parentFile.parentFile
68+ }))
69+ }
70+
71+
72+ abstract class UniqueModulesPropertiesUpdate : DefaultTask () {
73+
74+ @get:Inject
75+ abstract val layout: ProjectLayout
76+
77+ @get:Input
78+ abstract val skipUpdate: Property <Boolean >
79+
80+ @get:InputFiles
81+ abstract val modulesProperties: ConfigurableFileCollection
82+
83+ @get:OutputFile
84+ abstract val uniqueModulesProperties: RegularFileProperty
85+
86+ @TaskAction
87+ fun convert () {
88+ if (skipUpdate.get()) {
89+ return
9390 }
91+
92+ val modulesToRepoLocation = Properties ()
93+ modulesToRepoLocation.load(modulesProperties.singleFile.inputStream())
94+ val modules = modulesToRepoLocation.toSortedMap { e1, e2 -> e1.toString().compareTo(e2.toString()) }.map { entry ->
95+ val split = entry.value.toString().split(" /" )
96+ val group = split.subList(4 , split.size - 3 ).joinToString(" ." )
97+ val name = split[split.size - 3 ]
98+ // Special handling of "wrong" entries
99+ .replace(" -debug-jdk18on" , " -jdk18on" )
100+ val version = split[split.size - 2 ]
101+ Module (entry.key.toString(), " $group :$name " , version)
102+ }.groupBy { it.ga }.values.map { moduleList ->
103+ moduleList.maxBy { VersionNumber .parse(it.version) }
104+ }.sortedBy { it.name }
105+
106+ val modulesToCoordinates = modules.map { " ${it.name} =${it.ga} \n " }
107+ uniqueModulesProperties.get().asFile.writeText(modulesToCoordinates.joinToString(" " ).trim())
94108 }
109+
110+ data class Module (val name : String , val ga : String , val version : String )
95111}
0 commit comments