3131import org .gradle .api .file .Directory ;
3232import org .gradle .api .file .FileCollection ;
3333import org .gradle .api .file .ProjectLayout ;
34+ import org .gradle .api .file .RegularFileProperty ;
3435import org .gradle .api .model .ObjectFactory ;
3536import org .gradle .api .provider .MapProperty ;
3637import org .gradle .api .provider .Property ;
4546import org .gradlex .javamodule .dependencies .internal .utils .ModuleInfoClassCreator ;
4647
4748import javax .inject .Inject ;
49+ import java .io .CharArrayReader ;
4850import java .io .File ;
51+ import java .io .IOException ;
4952import java .util .Arrays ;
5053import java .util .Collections ;
5154import java .util .Comparator ;
5255import java .util .HashMap ;
5356import java .util .List ;
5457import java .util .Map ;
5558import java .util .Optional ;
59+ import java .util .Properties ;
5660import java .util .stream .Collectors ;
5761
5862import 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 /**
0 commit comments