Skip to content

Commit 27627d0

Browse files
authored
Configuration action for 'versions' project (#248)
1 parent 55c6b86 commit 27627d0

File tree

4 files changed

+130
-41
lines changed

4 files changed

+130
-41
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Java Module Dependencies Gradle Plugin - Changelog
22

3-
## Version 1.10.1
3+
## Version 1.11
44
* [#245](https://github.com/gradlex-org/java-module-dependencies/issues/245) Add 'allLocalModules' access to extension
5+
* [#245](https://github.com/gradlex-org/java-module-dependencies/issues/247) Defining a 'versions' project in settings supports applying additional plugins
56
* Update module name mappings
67

78
## Version 1.10

src/main/java/org/gradlex/javamodule/dependencies/initialization/JavaModulesExtension.java

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838

3939
import javax.inject.Inject;
4040
import java.io.File;
41-
import java.nio.file.Paths;
4241
import java.util.ArrayList;
4342
import java.util.List;
4443

@@ -74,7 +73,7 @@ public void module(String directory) {
7473
public void module(String directory, Action<Module> action) {
7574
Module module = getObjects().newInstance(Module.class, new File(settings.getRootDir(), directory));
7675
action.execute(module);
77-
includeModule(module, new File(settings.getRootDir(), directory));
76+
includeModule(module, new File(settings.getRootDir(), directory), false);
7877
}
7978

8079
/**
@@ -92,7 +91,7 @@ public void module(ProjectDescriptor project, Action<Module> action) {
9291
module.getArtifact().set(project.getName());
9392
module.getArtifact().finalizeValue(); // finalize, as the project name can no longer be changed
9493
action.execute(module);
95-
configureModule(module, project);
94+
configureModule(module, project, false);
9695
}
9796

9897
/**
@@ -111,7 +110,7 @@ public void directory(String directory, Action<Directory> action) {
111110
action.execute(moduleDirectory);
112111

113112
for (Module module : moduleDirectory.customizedModules.values()) {
114-
includeModule(module, module.directory);
113+
includeModule(module, module.directory, false);
115114
}
116115
Provider<List<String>> listProvider = getProviders().of(ValueModuleDirectoryListing.class, spec -> {
117116
spec.getParameters().getExclusions().set(moduleDirectory.getExclusions());
@@ -124,7 +123,7 @@ public void directory(String directory, Action<Directory> action) {
124123
Module module = moduleDirectory.addModule(projectDir);
125124
if (!module.getModuleInfoPaths().get().isEmpty()) {
126125
// only auto-include if there is at least one module-info.java
127-
includeModule(module, new File(modulesDirectory, projectDir));
126+
includeModule(module, new File(modulesDirectory, projectDir), false);
128127
}
129128
}
130129
}
@@ -133,47 +132,58 @@ public void directory(String directory, Action<Directory> action) {
133132
* Configure a subproject as Platform for defining Module versions.
134133
*/
135134
public void versions(String directory) {
136-
String projectName = Paths.get(directory).getFileName().toString();
137-
settings.include(projectName);
138-
settings.project(":" + projectName).setProjectDir(new File(settings.getRootDir(), directory));
139-
settings.getGradle().getLifecycle().beforeProject(new ApplyJavaModuleVersionsPluginAction(":" + projectName));
135+
versions(directory, m -> {});
140136
}
141137

142-
private void includeModule(Module module, File projectDir) {
138+
/**
139+
* Configure a subproject as Platform for defining Module versions.
140+
*/
141+
public void versions(String directory, Action<Module> action) {
142+
File versionProjectDir = new File(settings.getRootDir(), directory);
143+
Module module = getObjects().newInstance(Module.class, versionProjectDir);
144+
action.execute(module);
145+
includeModule(module, module.directory, true);
146+
}
147+
148+
private void includeModule(Module module, File projectDir, boolean definesVersions) {
143149
String artifact = module.getArtifact().get();
144150
settings.include(artifact);
145151
ProjectDescriptor project = settings.project(":" + artifact);
146152
project.setProjectDir(projectDir);
147153

148-
configureModule(module, project);
154+
configureModule(module, project, definesVersions);
149155
}
150156

151-
private void configureModule(Module module, ProjectDescriptor project) {
157+
private void configureModule(Module module, ProjectDescriptor project, boolean definesVersions) {
152158
String mainModuleName = null;
153-
for (String moduleInfoPath : module.getModuleInfoPaths().get()) {
154-
ModuleInfo moduleInfo = moduleInfoCache.put(project.getProjectDir(), moduleInfoPath,
155-
project.getPath(), module.getArtifact().get(), module.getGroup(), settings.getProviders());
156-
if (moduleInfoPath.contains("/main/")) {
157-
mainModuleName = moduleInfo.getModuleName();
159+
if (!definesVersions) {
160+
for (String moduleInfoPath : module.getModuleInfoPaths().get()) {
161+
ModuleInfo moduleInfo = moduleInfoCache.put(project.getProjectDir(), moduleInfoPath,
162+
project.getPath(), module.getArtifact().get(), module.getGroup(), settings.getProviders());
163+
if (moduleInfoPath.contains("/main/")) {
164+
mainModuleName = moduleInfo.getModuleName();
165+
}
158166
}
159167
}
160168

161169
String group = module.getGroup().getOrNull();
162170
List<String> plugins = module.getPlugins().get();
163-
moduleProjects.add(new ModuleProject(project.getPath(), group, plugins, mainModuleName));
171+
moduleProjects.add(new ModuleProject(project.getPath(), group, plugins, mainModuleName, definesVersions));
164172
}
165173

166174
private static class ModuleProject {
167175
private final String path;
168176
private final @Nullable String group;
169177
private final List<String> plugins;
170178
private final @Nullable String mainModuleName;
179+
private final boolean definesVersions;
171180

172-
public ModuleProject(String path, @Nullable String group, List<String> plugins, @Nullable String mainModuleName) {
181+
public ModuleProject(String path, @Nullable String group, List<String> plugins, @Nullable String mainModuleName, boolean definesVersions) {
173182
this.path = path;
174183
this.group = group;
175184
this.plugins = plugins;
176185
this.mainModuleName = mainModuleName;
186+
this.definesVersions = definesVersions;
177187
}
178188
}
179189

@@ -192,8 +202,14 @@ public void execute(Project project) {
192202
for (ModuleProject m : moduleProjects) {
193203
if (project.getPath().equals(m.path)) {
194204
if (m.group != null) project.setGroup(m.group);
195-
project.getPlugins().apply(JavaModuleDependenciesPlugin.class);
196-
project.getExtensions().getByType(JavaModuleDependenciesExtension.class).getModuleInfoCache().set(moduleInfoCache);
205+
if (m.definesVersions) {
206+
project.getPlugins().apply(JavaPlatformPlugin.class);
207+
project.getPlugins().apply(JavaModuleVersionsPlugin.class);
208+
project.getExtensions().getByType(JavaPlatformExtension.class).allowDependencies();
209+
} else {
210+
project.getPlugins().apply(JavaModuleDependenciesPlugin.class);
211+
project.getExtensions().getByType(JavaModuleDependenciesExtension.class).getModuleInfoCache().set(moduleInfoCache);
212+
}
197213
m.plugins.forEach(id -> project.getPlugins().apply(id));
198214
if (m.mainModuleName != null) {
199215
project.getPlugins().withType(ApplicationPlugin.class, p ->
@@ -203,22 +219,4 @@ public void execute(Project project) {
203219
}
204220
}
205221
}
206-
207-
private static class ApplyJavaModuleVersionsPluginAction implements IsolatedAction<Project> {
208-
209-
private final String projectPath;
210-
211-
public ApplyJavaModuleVersionsPluginAction(String projectPath) {
212-
this.projectPath = projectPath;
213-
}
214-
215-
@Override
216-
public void execute(Project project) {
217-
if (projectPath.equals(project.getPath())) {
218-
project.getPlugins().apply(JavaPlatformPlugin.class);
219-
project.getPlugins().apply(JavaModuleVersionsPlugin.class);
220-
project.getExtensions().getByType(JavaPlatformExtension.class).allowDependencies();
221-
}
222-
}
223-
}
224222
}

src/main/java/org/gradlex/javamodule/dependencies/initialization/Module.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
import javax.inject.Inject;
2323
import java.io.File;
24-
import java.nio.file.Paths;
2524
import java.util.Arrays;
2625
import java.util.stream.Collectors;
2726
import java.util.stream.Stream;
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright the GradleX team.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.gradlex.javamodule.dependencies.test.initialization;
18+
19+
import org.gradlex.javamodule.dependencies.test.fixture.GradleBuild;
20+
import org.junit.jupiter.api.BeforeEach;
21+
import org.junit.jupiter.api.Test;
22+
23+
import static java.util.Objects.requireNonNull;
24+
import static org.assertj.core.api.Assertions.assertThat;
25+
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS;
26+
import static org.gradle.testkit.runner.TaskOutcome.UP_TO_DATE;
27+
28+
class SettingsPluginVersionManagementTest {
29+
30+
GradleBuild build = new GradleBuild();
31+
32+
@BeforeEach
33+
void setup() {
34+
var buildFile = """
35+
plugins { id("java-library") }
36+
dependencies { implementation(platform(project(":versions"))) }""";
37+
build.settingsFile.writeText("""
38+
plugins { id("org.gradlex.java-module-dependencies") }
39+
dependencyResolutionManagement { repositories.mavenCentral() }
40+
""");
41+
build.appBuildFile.writeText(buildFile);
42+
build.libBuildFile.writeText(buildFile);
43+
}
44+
45+
@Test
46+
void can_define_a_version_providing_project_in_settings() {
47+
build.settingsFile.appendText("""
48+
javaModules {
49+
directory(".")
50+
versions("gradle/versions")
51+
}""");
52+
build.libModuleInfoFile.writeText("module abc.lib { }");
53+
build.appModuleInfoFile.writeText("""
54+
module org.gradlex.test.app {
55+
requires abc.lib;
56+
requires java.inject;
57+
}""");
58+
build.file("gradle/versions/build.gradle.kts").writeText("""
59+
moduleInfo {
60+
version("java.inject", "1.0.5")
61+
}""");
62+
63+
var result = build.runner(":app:compileJava").build();
64+
65+
assertThat(requireNonNull(result.task(":app:compileJava")).getOutcome()).isEqualTo(SUCCESS);
66+
}
67+
68+
@Test
69+
void can_define_a_version_providing_project_in_settings_with_additional_plugin() {
70+
build.settingsFile.appendText("""
71+
javaModules {
72+
directory(".")
73+
versions("gradle/versions") { plugin("maven-publish") }
74+
}""");
75+
build.libModuleInfoFile.writeText("module abc.lib { }");
76+
build.appModuleInfoFile.writeText("""
77+
module org.gradlex.test.app {
78+
requires abc.lib;
79+
requires java.inject;
80+
}""");
81+
build.file("gradle/versions/build.gradle.kts").writeText("""
82+
moduleInfo {
83+
version("java.inject", "1.0.5")
84+
}""");
85+
86+
var result = build.runner(":versions:publish").build();
87+
88+
assertThat(requireNonNull(result.task(":versions:publish")).getOutcome()).isEqualTo(UP_TO_DATE);
89+
}
90+
91+
}

0 commit comments

Comments
 (0)