Skip to content

Commit 5e873fb

Browse files
committed
Support local modules.properties for custom mappings
Resolves #67
1 parent 6675e53 commit 5e873fb

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

src/main/java/org/gradlex/javamodule/dependencies/JavaModuleDependenciesExtension.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.gradle.api.file.Directory;
3232
import org.gradle.api.file.FileCollection;
3333
import org.gradle.api.file.ProjectLayout;
34+
import org.gradle.api.file.RegularFileProperty;
3435
import org.gradle.api.model.ObjectFactory;
3536
import org.gradle.api.provider.MapProperty;
3637
import org.gradle.api.provider.Property;
@@ -45,14 +46,17 @@
4546
import org.gradlex.javamodule.dependencies.internal.utils.ModuleInfoClassCreator;
4647

4748
import javax.inject.Inject;
49+
import java.io.CharArrayReader;
4850
import java.io.File;
51+
import java.io.IOException;
4952
import java.util.Arrays;
5053
import java.util.Collections;
5154
import java.util.Comparator;
5255
import java.util.HashMap;
5356
import java.util.List;
5457
import java.util.Map;
5558
import java.util.Optional;
59+
import java.util.Properties;
5660
import java.util.stream.Collectors;
5761

5862
import static java.util.Optional.empty;
@@ -70,6 +74,13 @@ public abstract class JavaModuleDependenciesExtension {
7074
private final VersionCatalogsExtension versionCatalogs;
7175
private final ModuleInfoCache moduleInfoCache;
7276

77+
/**
78+
* Custom mappings can be defined in a property files in your build.
79+
* The default location for this file is 'gradle/modules.properties' (relative to root project).
80+
* Here, the location of the file can be changed.
81+
*/
82+
public abstract RegularFileProperty getModulesProperties();
83+
7384
/**
7485
* Register mapping from Module Name to GA Coordinates (and optionally Capability Coordinates).
7586
* - moduleNameToGA.put("org.slf4j", "org.slf4j:slf4j-api")
@@ -113,9 +124,25 @@ public abstract class JavaModuleDependenciesExtension {
113124
public JavaModuleDependenciesExtension(VersionCatalogsExtension versionCatalogs) {
114125
this.versionCatalogs = versionCatalogs;
115126
this.moduleInfoCache = getObjects().newInstance(ModuleInfoCache.class);
127+
getModulesProperties().set(getProject().getRootProject().getLayout().getProjectDirectory().file("gradle/modules.properties"));
116128
getVersionCatalogName().convention("libs");
117129
getAnalyseOnly().convention(false);
118130
getModuleNameToGA().putAll(SharedMappings.mappings);
131+
getModuleNameToGA().putAll(parsedModulesProperties().orElse(Collections.emptyMap()));
132+
}
133+
134+
private Provider<Map<String, String>> parsedModulesProperties() {
135+
return getProviders().fileContents(getModulesProperties()).getAsText().map(c -> {
136+
Properties p = new Properties();
137+
try {
138+
p.load(new CharArrayReader(c.toCharArray()));
139+
} catch (IOException e) {
140+
throw new RuntimeException(e);
141+
}
142+
@SuppressWarnings({"rawtypes"})
143+
Map<String, String> result = (Map) p;
144+
return result;
145+
});
119146
}
120147

121148
/**

src/test/groovy/org/gradlex/javamodule/dependencies/test/CustomizationTest.groovy

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,52 @@ class CustomizationTest extends Specification {
3434
result.output.contains('[jakarta.mail-2.0.1.jar, jakarta.activation-2.0.1.jar]')
3535
}
3636

37+
def "can add custom mapping via properties file (default location)"() {
38+
given:
39+
def customModulesPropertiesFile = file("gradle/modules.properties")
40+
41+
customModulesPropertiesFile << 'jakarta.mail=com.sun.mail:jakarta.mail'
42+
appBuildFile << 'moduleInfo { version("jakarta.mail", "2.0.1") }'
43+
44+
appModuleInfoFile << '''
45+
module org.gradlex.test.app {
46+
requires jakarta.mail;
47+
}
48+
'''
49+
50+
when:
51+
def result = printRuntimeJars()
52+
53+
then:
54+
result.output.contains('[jakarta.mail-2.0.1.jar, jakarta.activation-2.0.1.jar]')
55+
}
56+
57+
def "can add custom mapping via properties file (custom location)"() {
58+
given:
59+
def customModulesPropertiesFile = file(".hidden/modules.properties")
60+
61+
customModulesPropertiesFile << 'jakarta.mail=com.sun.mail:jakarta.mail'
62+
appBuildFile << 'moduleInfo { version("jakarta.mail", "2.0.1") }'
63+
64+
appBuildFile << '''
65+
javaModuleDependencies {
66+
modulesProperties.set(rootProject.layout.projectDirectory.file(".hidden/modules.properties"))
67+
}
68+
'''
69+
70+
appModuleInfoFile << '''
71+
module org.gradlex.test.app {
72+
requires jakarta.mail;
73+
}
74+
'''
75+
76+
when:
77+
def result = printRuntimeJars()
78+
79+
then:
80+
result.output.contains('[jakarta.mail-2.0.1.jar, jakarta.activation-2.0.1.jar]')
81+
}
82+
3783
def "can use custom catalog"() {
3884
given:
3985
settingsFile << '''

src/test/groovy/org/gradlex/javamodule/dependencies/test/fixture/GradleBuild.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ class GradleBuild {
3434
appBuildFile << '''
3535
plugins {
3636
id("org.gradlex.java-module-dependencies")
37+
id("org.gradlex.java-module-versions")
3738
id("application")
3839
}
40+
javaModuleDependencies {
41+
versionsFromPlatformAndConsistentResolution(":app", ":app")
42+
}
3943
application {
4044
mainModule.set("org.gradlex.test.app")
4145
mainClass.set("org.gradlex.test.app.Main")

0 commit comments

Comments
 (0)