Skip to content

Commit 25151f5

Browse files
committed
Add built-in "platform" support
Also supports a "platform" as variant of the application.
1 parent 8bc1522 commit 25151f5

File tree

2 files changed

+73
-10
lines changed

2 files changed

+73
-10
lines changed

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

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.gradle.api.artifacts.Configuration;
2222
import org.gradle.api.artifacts.ConfigurationContainer;
2323
import org.gradle.api.artifacts.Dependency;
24+
import org.gradle.api.artifacts.ModuleDependency;
2425
import org.gradle.api.artifacts.ProjectDependency;
2526
import org.gradle.api.artifacts.VersionCatalog;
2627
import org.gradle.api.artifacts.VersionCatalogsExtension;
@@ -37,6 +38,7 @@
3738
import org.gradle.api.provider.Provider;
3839
import org.gradle.api.provider.ProviderFactory;
3940
import org.gradle.api.tasks.SourceSet;
41+
import org.gradle.api.tasks.SourceSetContainer;
4042
import org.gradle.api.tasks.compile.JavaCompile;
4143
import org.gradle.api.tasks.javadoc.Javadoc;
4244
import org.gradlex.javamodule.dependencies.internal.compile.AddSyntheticModulesToCompileClasspathAction;
@@ -45,6 +47,7 @@
4547

4648
import javax.inject.Inject;
4749
import java.io.File;
50+
import java.util.Arrays;
4851
import java.util.Collections;
4952
import java.util.Comparator;
5053
import java.util.HashMap;
@@ -299,16 +302,42 @@ public void versionsFromConsistentResolution(String... versionsProvidingProjects
299302
c.setCanBeConsumed(false);
300303
c.getAttributes().attribute(Usage.USAGE_ATTRIBUTE, getObjects().named(Usage.class, Usage.JAVA_RUNTIME));
301304
});
302-
getConfigurations().all(c -> {
303-
if (c != mainRuntimeClasspath) {
305+
getConfigurations().configureEach(c -> {
306+
if (c.isCanBeResolved() && c != mainRuntimeClasspath) {
304307
c.shouldResolveConsistentlyWith(mainRuntimeClasspath);
305308
}
306309
});
307310
for (String versionsProvidingProject : versionsProvidingProjects) {
308-
getDependencies().add(mainRuntimeClasspath.getName(), getDependencies().project(Collections.singletonMap("path", versionsProvidingProject)));
311+
getDependencies().add(mainRuntimeClasspath.getName(), createDependency(versionsProvidingProject));
309312
}
310313
}
311314

315+
public void versionsFromPlatformAndConsistentResolution(String platformProject, String... versionsProvidingProjects) {
316+
boolean platformInJavaProject = Arrays.asList(versionsProvidingProjects).contains(platformProject);
317+
getSourceSets().configureEach(sourceSet -> getConfigurations().getByName(sourceSet.getImplementationConfigurationName()).withDependencies(d -> {
318+
Dependency platformDependency = getDependencies().platform(createDependency(platformProject));
319+
if (platformInJavaProject) {
320+
if (platformProject.startsWith(":")) {
321+
String capability = ((ProjectDependency) platformDependency).getDependencyProject().getGroup() + platformProject + "-platform";
322+
((ProjectDependency) platformDependency).capabilities(c -> c.requireCapability(capability));
323+
} else if (platformDependency instanceof ModuleDependency) {
324+
String capability = platformProject + "-platform";
325+
((ModuleDependency) platformDependency).capabilities(c -> c.requireCapability(capability));
326+
}
327+
}
328+
d.add(platformDependency);
329+
}));
330+
331+
versionsFromConsistentResolution(versionsProvidingProjects);
332+
}
333+
334+
private Dependency createDependency(String project) {
335+
boolean isProjectInBuild = project.startsWith(":");
336+
return getDependencies().create(isProjectInBuild
337+
? getDependencies().project(Collections.singletonMap("path", project))
338+
: project);
339+
}
340+
312341
/**
313342
* Adds support for compiling module-info.java in the given source set with the given task,
314343
* if 'requires runtime' dependencies are used.
@@ -389,6 +418,9 @@ private String moduleDebugInfo(String moduleName, File moduleInfoFile, File root
389418
@Inject
390419
protected abstract ConfigurationContainer getConfigurations();
391420

421+
@Inject
422+
protected abstract SourceSetContainer getSourceSets();
423+
392424
ModuleInfoCache getModuleInfoCache() {
393425
return moduleInfoCache;
394426
}

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

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,58 @@
2020
import org.gradle.api.Plugin;
2121
import org.gradle.api.Project;
2222
import org.gradle.api.artifacts.Configuration;
23+
import org.gradle.api.attributes.Usage;
24+
import org.gradle.api.internal.artifacts.configurations.ConfigurationInternal;
25+
import org.gradle.api.model.ObjectFactory;
2326
import org.gradle.api.plugins.JavaPlatformPlugin;
2427
import org.gradle.api.plugins.JavaPlugin;
28+
import org.gradle.api.tasks.SourceSetContainer;
2529
import org.gradlex.javamodule.dependencies.dsl.ModuleVersions;
2630

31+
import static org.gradle.api.attributes.Usage.JAVA_RUNTIME;
32+
import static org.gradle.api.plugins.JavaPlatformPlugin.API_CONFIGURATION_NAME;
33+
2734
@SuppressWarnings("unused")
2835
@NonNullApi
2936
public abstract class JavaModuleVersionsPlugin implements Plugin<Project> {
3037

3138
@Override
3239
public void apply(Project project) {
33-
project.getPlugins().withType(JavaPlugin.class, javaPlugin -> setupForProject(project));
34-
project.getPlugins().withType(JavaPlatformPlugin.class, javaPlugin -> setupForProject(project));
40+
project.getPlugins().withType(JavaPlatformPlugin.class, plugin -> setupForJavaPlatformProject(project));
41+
project.getPlugins().withType(JavaPlugin.class, plugin -> setupForJavaProject(project));
42+
}
43+
44+
private void setupForJavaPlatformProject(Project project) {
45+
setupVersionsDSL(project, project.getConfigurations().getByName(API_CONFIGURATION_NAME));
46+
}
47+
48+
private void setupForJavaProject(Project project) {
49+
ObjectFactory objects = project.getObjects();
50+
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
51+
52+
Configuration versions = project.getConfigurations().create("versions", c -> {
53+
c.setCanBeResolved(false);
54+
c.setCanBeConsumed(false);
55+
});
56+
57+
project.getConfigurations().create("platformElements", c -> {
58+
c.setCanBeResolved(false);
59+
c.setCanBeConsumed(true);
60+
c.setVisible(false);
61+
c.extendsFrom(versions);
62+
c.getAttributes().attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, JAVA_RUNTIME));
63+
// c.getAttributes().attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, REGULAR_PLATFORM));
64+
((ConfigurationInternal) c).beforeLocking(conf -> {
65+
c.getOutgoing().capability(project.getGroup() + ":" + project.getName() + "-platform:" + project.getVersion());
66+
});
67+
});
68+
69+
setupVersionsDSL(project, versions);
3570
}
3671

37-
private void setupForProject(Project project) {
72+
private void setupVersionsDSL(Project project, Configuration configuration) {
3873
project.getPlugins().apply(JavaModuleDependenciesPlugin.class);
3974
JavaModuleDependenciesExtension javaModuleDependencies = project.getExtensions().getByType(JavaModuleDependenciesExtension.class);
40-
Configuration configuration = project.getConfigurations().findByName(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME);
41-
if (configuration == null) {
42-
configuration = project.getConfigurations().getByName(JavaPlatformPlugin.API_CONFIGURATION_NAME);
43-
}
4475
project.getExtensions().create("moduleInfo", ModuleVersions.class, configuration, javaModuleDependencies);
4576
}
4677

0 commit comments

Comments
 (0)