1- plugins {
2- id(" gradlexbuild.module-mappings" )
3- id(" org.gradlex.internal.plugin-publish-conventions" ) version " 0.6"
4- }
1+ import java.util.Properties
2+ import org.gradle.api.internal.project.ProjectInternal
3+ import org.gradle.util.internal.VersionNumber
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,88 @@ 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" )
62- }
37+ testingConventions { testGradleVersions(" 7.4" , " 7.6.5" , " 8.0.2" , " 8.14.3" ) }
6338
64- tasks.test {
65- useJUnitPlatform()
66- maxParallelForks = 4
67- inputs.dir(layout.projectDirectory.dir(" samples" ))
39+ val detachedResolver: ProjectInternal .DetachedResolver = (project as ProjectInternal ).newDetachedResolver()
40+
41+ detachedResolver.repositories.ivy {
42+ name = " Modules Properties Repository"
43+ url = project.uri(" https://raw.githubusercontent.com/sormuras/modules/main/com.github.sormuras.modules" )
44+ metadataSources.artifact()
45+ patternLayout {
46+ artifact(" [organisation]/[module].properties" )
47+ ivy(" [module]/[revision]/ivy.xml" )
48+ setM2compatible(true )
49+ }
6850}
6951
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- }
52+ val modulePropertiesScope = detachedResolver.configurations.dependencyScope(" moduleProperties" )
53+ val modulePropertiesPath =
54+ detachedResolver.configurations.resolvable(" modulePropertiesPath" ) { extendsFrom(modulePropertiesScope.get()) }
55+ val dep = detachedResolver.dependencies.add(modulePropertiesScope.name, " com.github.sormuras.modules:modules:1" )
56+
57+ (dep as ExternalModuleDependency ).isChanging = true
58+
59+ val updateUniqueModulesProperties =
60+ tasks.register<UniqueModulesPropertiesUpdate >(" updateUniqueModulesProperties" ) {
61+ skipUpdate.set(providers.environmentVariable(" CI" ).getOrElse(" false" ).toBoolean())
62+ modulesProperties.from(modulePropertiesPath)
63+ uniqueModulesProperties.set(
64+ layout.projectDirectory.file(
65+ " src/main/resources/org/gradlex/javamodule/dependencies/unique_modules.properties"
66+ )
67+ )
8768 }
88- targets.all {
89- testTask {
90- maxParallelForks = 4
91- inputs.dir(layout.projectDirectory.dir(" samples" ))
92- inputs.dir(" samples" )
69+
70+ sourceSets.main {
71+ resources.setSrcDirs(
72+ listOf (
73+ updateUniqueModulesProperties.map {
74+ it.uniqueModulesProperties.get().asFile.parentFile.parentFile.parentFile.parentFile.parentFile
75+ }
76+ )
77+ )
78+ }
79+
80+ abstract class UniqueModulesPropertiesUpdate : DefaultTask () {
81+
82+ @get:Inject abstract val layout: ProjectLayout
83+
84+ @get:Input abstract val skipUpdate: Property <Boolean >
85+
86+ @get:InputFiles abstract val modulesProperties: ConfigurableFileCollection
87+
88+ @get:OutputFile abstract val uniqueModulesProperties: RegularFileProperty
89+
90+ @TaskAction
91+ fun convert () {
92+ if (skipUpdate.get()) {
93+ return
9394 }
95+
96+ val modulesToRepoLocation = Properties ()
97+ modulesToRepoLocation.load(modulesProperties.singleFile.inputStream())
98+ val modules =
99+ modulesToRepoLocation
100+ .toSortedMap { e1, e2 -> e1.toString().compareTo(e2.toString()) }
101+ .map { entry ->
102+ val split = entry.value.toString().split(" /" )
103+ val group = split.subList(4 , split.size - 3 ).joinToString(" ." )
104+ val name =
105+ split[split.size - 3 ]
106+ // Special handling of "wrong" entries
107+ .replace(" -debug-jdk18on" , " -jdk18on" )
108+ val version = split[split.size - 2 ]
109+ Module (entry.key.toString(), " $group :$name " , version)
110+ }
111+ .groupBy { it.ga }
112+ .values
113+ .map { moduleList -> moduleList.maxBy { VersionNumber .parse(it.version) } }
114+ .sortedBy { it.name }
115+
116+ val modulesToCoordinates = modules.map { " ${it.name} =${it.ga} \n " }
117+ uniqueModulesProperties.get().asFile.writeText(modulesToCoordinates.joinToString(" " ).trim())
94118 }
119+
120+ data class Module (val name : String , val ga : String , val version : String )
95121}
0 commit comments