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.4.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
42- pluginPublishConventions {
43- id(" ${project.group} .${project.name} " )
44- implementationClass(" org.gradlex.javamodule.dependencies.JavaModuleDependenciesPlugin" )
45- displayName(" Java Module Dependencies Gradle Plugin" )
46- description(" A plugin that makes Gradle respect the dependencies defined in 'module-info.java' files." )
47- tags(" gradlex" , " java" , " modularity" , " jigsaw" , " jpms" , " dependencies" , " versions" )
18+ publishingConventions {
19+ pluginPortal(" ${project.group} .${project.name} " ) {
20+ implementationClass(" org.gradlex.javamodule.dependencies.JavaModuleDependenciesPlugin" )
21+ displayName(" Java Module Dependencies Gradle Plugin" )
22+ description(" A plugin that makes Gradle respect the dependencies defined in 'module-info.java' files." )
23+ tags(" gradlex" , " java" , " modularity" , " jigsaw" , " jpms" , " dependencies" , " versions" )
24+ }
25+ pluginPortal(" ${project.group} .java-module-versions" ) {
26+ implementationClass(" org.gradlex.javamodule.dependencies.JavaModuleVersionsPlugin" )
27+ displayName(" Java Module Versions Gradle Plugin" )
28+ description(" A plugin that makes Gradle respect the dependencies defined in 'module-info.java' files." )
29+ }
4830 gitHub(" https://github.com/gradlex-org/java-module-dependencies" )
4931 developer {
5032 id.set(" jjohannes" )
@@ -53,43 +35,88 @@ pluginPublishConventions {
5335 }
5436}
5537
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- }
38+ testingConventions { testGradleVersions(" 7.4" , " 7.6.5" , " 8.0.2" , " 8.14.3" ) }
6339
64- tasks.test {
65- useJUnitPlatform()
66- maxParallelForks = 4
67- inputs.dir(layout.projectDirectory.dir(" samples" ))
40+ val detachedResolver: ProjectInternal .DetachedResolver = (project as ProjectInternal ).newDetachedResolver()
41+
42+ detachedResolver.repositories.ivy {
43+ name = " Modules Properties Repository"
44+ url = project.uri(" https://raw.githubusercontent.com/sormuras/modules/main/com.github.sormuras.modules" )
45+ metadataSources.artifact()
46+ patternLayout {
47+ artifact(" [organisation]/[module].properties" )
48+ ivy(" [module]/[revision]/ivy.xml" )
49+ setM2compatible(true )
50+ }
6851}
6952
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- }
53+ val modulePropertiesScope = detachedResolver.configurations.dependencyScope(" moduleProperties" )
54+ val modulePropertiesPath =
55+ detachedResolver.configurations.resolvable(" modulePropertiesPath" ) { extendsFrom(modulePropertiesScope.get()) }
56+ val dep = detachedResolver.dependencies.add(modulePropertiesScope.name, " com.github.sormuras.modules:modules:1" )
57+
58+ (dep as ExternalModuleDependency ).isChanging = true
59+
60+ val updateUniqueModulesProperties =
61+ tasks.register<UniqueModulesPropertiesUpdate >(" updateUniqueModulesProperties" ) {
62+ skipUpdate.set(providers.environmentVariable(" CI" ).getOrElse(" false" ).toBoolean())
63+ modulesProperties.from(modulePropertiesPath)
64+ uniqueModulesProperties.set(
65+ layout.projectDirectory.file(
66+ " src/main/resources/org/gradlex/javamodule/dependencies/unique_modules.properties"
67+ )
68+ )
8769 }
88- targets.all {
89- testTask {
90- maxParallelForks = 4
91- inputs.dir(layout.projectDirectory.dir(" samples" ))
92- inputs.dir(" samples" )
70+
71+ sourceSets.main {
72+ resources.setSrcDirs(
73+ listOf (
74+ updateUniqueModulesProperties.map {
75+ it.uniqueModulesProperties.get().asFile.parentFile.parentFile.parentFile.parentFile.parentFile
76+ }
77+ )
78+ )
79+ }
80+
81+ abstract class UniqueModulesPropertiesUpdate : DefaultTask () {
82+
83+ @get:Inject abstract val layout: ProjectLayout
84+
85+ @get:Input abstract val skipUpdate: Property <Boolean >
86+
87+ @get:InputFiles abstract val modulesProperties: ConfigurableFileCollection
88+
89+ @get:OutputFile abstract val uniqueModulesProperties: RegularFileProperty
90+
91+ @TaskAction
92+ fun convert () {
93+ if (skipUpdate.get()) {
94+ return
9395 }
96+
97+ val modulesToRepoLocation = Properties ()
98+ modulesToRepoLocation.load(modulesProperties.singleFile.inputStream())
99+ val modules =
100+ modulesToRepoLocation
101+ .toSortedMap { e1, e2 -> e1.toString().compareTo(e2.toString()) }
102+ .map { entry ->
103+ val split = entry.value.toString().split(" /" )
104+ val group = split.subList(4 , split.size - 3 ).joinToString(" ." )
105+ val name =
106+ split[split.size - 3 ]
107+ // Special handling of "wrong" entries
108+ .replace(" -debug-jdk18on" , " -jdk18on" )
109+ val version = split[split.size - 2 ]
110+ Module (entry.key.toString(), " $group :$name " , version)
111+ }
112+ .groupBy { it.ga }
113+ .values
114+ .map { moduleList -> moduleList.maxBy { VersionNumber .parse(it.version) } }
115+ .sortedBy { it.name }
116+
117+ val modulesToCoordinates = modules.map { " ${it.name} =${it.ga} \n " }
118+ uniqueModulesProperties.get().asFile.writeText(modulesToCoordinates.joinToString(" " ).trim())
94119 }
120+
121+ data class Module (val name : String , val ga : String , val version : String )
95122}
0 commit comments