|
16 | 16 |
|
17 | 17 | package org.gradlex.javamodule.dependencies; |
18 | 18 |
|
19 | | -import org.gradlex.javamodule.dependencies.internal.bridges.ExtraJavaModuleInfoBridge; |
20 | | -import org.gradlex.javamodule.dependencies.internal.utils.ModuleInfo; |
21 | | -import org.gradlex.javamodule.dependencies.tasks.ModuleInfoGeneration; |
22 | | -import org.gradlex.javamodule.dependencies.tasks.ModuleVersionRecommendation; |
23 | | -import org.gradlex.javamodule.dependencies.tasks.ModulePathAnalysis; |
24 | 19 | import org.gradle.api.GradleException; |
25 | 20 | import org.gradle.api.NonNullApi; |
26 | 21 | import org.gradle.api.Plugin; |
|
38 | 33 | import org.gradle.api.tasks.SourceSet; |
39 | 34 | import org.gradle.api.tasks.SourceSetContainer; |
40 | 35 | import org.gradle.api.tasks.TaskProvider; |
| 36 | +import org.gradle.api.tasks.compile.JavaCompile; |
41 | 37 | import org.gradle.util.GradleVersion; |
| 38 | +import org.gradlex.javamodule.dependencies.internal.bridges.ExtraJavaModuleInfoBridge; |
| 39 | +import org.gradlex.javamodule.dependencies.internal.compile.AddSyntheticModulesToCompileClasspathAction; |
| 40 | +import org.gradlex.javamodule.dependencies.internal.utils.ModuleInfo; |
| 41 | +import org.gradlex.javamodule.dependencies.tasks.ModuleInfoGeneration; |
| 42 | +import org.gradlex.javamodule.dependencies.tasks.ModulePathAnalysis; |
| 43 | +import org.gradlex.javamodule.dependencies.tasks.ModuleVersionRecommendation; |
42 | 44 |
|
43 | 45 | import javax.annotation.Nullable; |
44 | 46 | import java.io.File; |
45 | 47 | import java.util.HashMap; |
| 48 | +import java.util.List; |
46 | 49 | import java.util.Map; |
47 | 50 | import java.util.Optional; |
48 | 51 | import java.util.stream.Collectors; |
@@ -84,6 +87,15 @@ private void setupForJavaProject(Project project, JavaModuleDependenciesExtensio |
84 | 87 | process(ModuleInfo.Directive.REQUIRES_TRANSITIVE, sourceSet.getApiConfigurationName(), sourceSet, project, javaModuleDependencies); |
85 | 88 | process(ModuleInfo.Directive.REQUIRES_STATIC_TRANSITIVE, sourceSet.getCompileOnlyApiConfigurationName(), sourceSet, project, javaModuleDependencies); |
86 | 89 | process(ModuleInfo.Directive.REQUIRES_RUNTIME, sourceSet.getRuntimeOnlyConfigurationName(), sourceSet, project, javaModuleDependencies); |
| 90 | + |
| 91 | + project.getTasks().named(sourceSet.getCompileJavaTaskName(), JavaCompile.class, javaCompile -> { |
| 92 | + ModuleInfo moduleInfo = findModuleInfoInSourceSet(sourceSet, project); |
| 93 | + List<String> requiresRuntime = moduleInfo.get(ModuleInfo.Directive.REQUIRES_RUNTIME); |
| 94 | + if (!requiresRuntime.isEmpty()) { |
| 95 | + javaCompile.doFirst(project.getObjects().newInstance(AddSyntheticModulesToCompileClasspathAction.class, |
| 96 | + project.getLayout().getBuildDirectory().dir("tmp").get().getAsFile(), requiresRuntime)); |
| 97 | + } |
| 98 | + }); |
87 | 99 | }); |
88 | 100 | setupReportTasks(project, javaModuleDependencies); |
89 | 101 | setupMigrationTasks(project, javaModuleDependencies); |
@@ -150,34 +162,43 @@ private void setupMigrationTasks(Project project, JavaModuleDependenciesExtensio |
150 | 162 | private void process(ModuleInfo.Directive moduleDirective, String gradleConfiguration, SourceSet sourceSet, Project project, JavaModuleDependenciesExtension javaModuleDependenciesExtension) { |
151 | 163 | Configuration conf = project.getConfigurations().findByName(gradleConfiguration); |
152 | 164 | if (conf != null) { |
153 | | - conf.withDependencies(d -> findAndReadModuleInfo(moduleDirective, sourceSet, project, conf, javaModuleDependenciesExtension)); |
| 165 | + conf.withDependencies(d -> readModuleInfo(moduleDirective, sourceSet, project, conf, javaModuleDependenciesExtension)); |
154 | 166 | } else { |
155 | 167 | project.getConfigurations().whenObjectAdded(lateAddedConf -> { |
156 | 168 | if (gradleConfiguration.equals(lateAddedConf.getName())) { |
157 | | - lateAddedConf.withDependencies(d -> findAndReadModuleInfo(moduleDirective, sourceSet, project, lateAddedConf, javaModuleDependenciesExtension)); |
| 169 | + lateAddedConf.withDependencies(d -> readModuleInfo(moduleDirective, sourceSet, project, lateAddedConf, javaModuleDependenciesExtension)); |
158 | 170 | } |
159 | 171 | }); |
160 | 172 | } |
161 | 173 | } |
162 | 174 |
|
163 | | - private void findAndReadModuleInfo(ModuleInfo.Directive moduleDirective, SourceSet sourceSet, Project project, Configuration configuration, JavaModuleDependenciesExtension javaModuleDependenciesExtension) { |
| 175 | + private void readModuleInfo(ModuleInfo.Directive moduleDirective, SourceSet sourceSet, Project project, Configuration configuration, JavaModuleDependenciesExtension javaModuleDependenciesExtension) { |
| 176 | + ModuleInfo moduleInfo = findModuleInfoInSourceSet(sourceSet, project); |
| 177 | + String ownModuleNamesPrefix = moduleInfo.moduleNamePrefix(project.getName(), sourceSet.getName()); |
| 178 | + for (String moduleName : moduleInfo.get(moduleDirective)) { |
| 179 | + declareDependency(moduleName, ownModuleNamesPrefix, moduleInfo.getFilePath(), project, configuration, javaModuleDependenciesExtension); |
| 180 | + } |
| 181 | + } |
| 182 | + |
| 183 | + /** |
| 184 | + * Returns the module-info.java for the given SourceSet. If the SourceSet has multiple source folders with multiple |
| 185 | + * module-info files (which is usually a broken setup) the first file found is returned. |
| 186 | + */ |
| 187 | + private ModuleInfo findModuleInfoInSourceSet(SourceSet sourceSet, Project project) { |
164 | 188 | for (File folder : sourceSet.getJava().getSrcDirs()) { |
165 | 189 | Provider<RegularFile> moduleInfoFile = project.getLayout().file(project.provider(() -> new File(folder, "module-info.java"))); |
166 | 190 | Provider<String> moduleInfoContent = project.getProviders().fileContents(moduleInfoFile).getAsText(); |
167 | 191 | if (moduleInfoContent.isPresent()) { |
168 | | - if (!this.moduleInfo.containsKey(folder)) { |
169 | | - this.moduleInfo.put(folder, new ModuleInfo(moduleInfoContent.get())); |
170 | | - } |
171 | | - ModuleInfo moduleInfo = this.moduleInfo.get(folder); |
172 | | - String ownModuleNamesPrefix = moduleInfo.moduleNamePrefix(project.getName(), sourceSet.getName()); |
173 | | - for (String moduleName : moduleInfo.get(moduleDirective)) { |
174 | | - declareDependency(moduleName, ownModuleNamesPrefix, moduleInfoFile, project, configuration, javaModuleDependenciesExtension); |
| 192 | + if (!moduleInfo.containsKey(folder)) { |
| 193 | + moduleInfo.put(folder, new ModuleInfo(moduleInfoContent.get(), moduleInfoFile.get().getAsFile())); |
175 | 194 | } |
| 195 | + return moduleInfo.get(folder); |
176 | 196 | } |
177 | 197 | } |
| 198 | + return ModuleInfo.EMPTY; |
178 | 199 | } |
179 | 200 |
|
180 | | - private void declareDependency(String moduleName, @Nullable String ownModuleNamesPrefix, Provider<RegularFile> moduleInfoFile, Project project, Configuration configuration, JavaModuleDependenciesExtension javaModuleDependencies) { |
| 201 | + private void declareDependency(String moduleName, @Nullable String ownModuleNamesPrefix, File moduleInfoFile, Project project, Configuration configuration, JavaModuleDependenciesExtension javaModuleDependencies) { |
181 | 202 | if (JDKInfo.MODULES.contains(moduleName)) { |
182 | 203 | // The module is part of the JDK, no dependency required |
183 | 204 | return; |
@@ -241,17 +262,17 @@ private void declareDependency(String moduleName, @Nullable String ownModuleName |
241 | 262 | } |
242 | 263 | } |
243 | 264 |
|
244 | | - private void warnVersionMissing(String moduleName, Map<String, Object> ga, Provider<RegularFile> moduleInfoFile, Project project, JavaModuleDependenciesExtension javaModuleDependencies) { |
| 265 | + private void warnVersionMissing(String moduleName, Map<String, Object> ga, File moduleInfoFile, Project project, JavaModuleDependenciesExtension javaModuleDependencies) { |
245 | 266 | if (javaModuleDependencies.getWarnForMissingVersions().get()) { |
246 | 267 | project.getLogger().warn("[WARN] [Java Module Dependencies] No version defined in catalog - " + ga.get(GAV.GROUP) + ":" + ga.get(GAV.ARTIFACT) + " - " |
247 | 268 | + moduleDebugInfo(moduleName.replace('.', '_'), moduleInfoFile, project.getRootDir())); |
248 | 269 | } |
249 | 270 | } |
250 | 271 |
|
251 | | - private String moduleDebugInfo(String moduleName, Provider<RegularFile> moduleInfoFile, File rootDir) { |
| 272 | + private String moduleDebugInfo(String moduleName, File moduleInfoFile, File rootDir) { |
252 | 273 | return moduleName |
253 | 274 | + " (required in " |
254 | | - + moduleInfoFile.get().getAsFile().getAbsolutePath().substring(rootDir.getAbsolutePath().length() + 1) |
| 275 | + + moduleInfoFile.getAbsolutePath().substring(rootDir.getAbsolutePath().length() + 1) |
255 | 276 | + ")"; |
256 | 277 | } |
257 | 278 |
|
|
0 commit comments