Skip to content

Commit 7420c2b

Browse files
authored
fix: make FilesTaskV2 gradle 9 compatible (#4482)
* fix: make FilesTaskV2 gradle 9 compatible * some clean up * fix formatting * added more robust logic to determining error in gradle version * fix formatting
1 parent 349c809 commit 7420c2b

File tree

1 file changed

+68
-14
lines changed
  • jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold

1 file changed

+68
-14
lines changed

jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.gradle.api.tasks.SourceSet;
4242
import org.gradle.api.tasks.SourceSetContainer;
4343
import org.gradle.api.tasks.TaskAction;
44-
import org.gradle.util.GradleVersion;
4544

4645
/**
4746
* Prints out changing source dependencies on a project.
@@ -51,8 +50,6 @@
5150
*/
5251
public class FilesTaskV2 extends DefaultTask {
5352

54-
private static final GradleVersion GRADLE_9 = GradleVersion.version("9.0");
55-
5653
private final SkaffoldFilesOutput skaffoldFilesOutput = new SkaffoldFilesOutput();
5754

5855
@Nullable private JibExtension jibExtension;
@@ -91,16 +88,16 @@ public void listFiles() throws IOException {
9188

9289
Set<File> projectDependencyJars = new HashSet<>();
9390
for (ProjectDependency projectDependency : projectDependencies) {
94-
addProjectFiles(projectDependency.getDependencyProject());
91+
Project dependentProject = getDependentProject(projectDependency);
92+
addProjectFiles(dependentProject);
9593

9694
// Keep track of project dependency jars for filtering out later
9795
String configurationName = projectDependency.getTargetConfiguration();
9896
if (configurationName == null) {
9997
configurationName = "default";
10098
}
101-
Project dependencyProject = projectDependency.getDependencyProject();
10299
for (Configuration targetConfiguration :
103-
dependencyProject.getConfigurations().getByName(configurationName).getHierarchy()) {
100+
dependentProject.getConfigurations().getByName(configurationName).getHierarchy()) {
104101
for (PublishArtifact artifact : targetConfiguration.getArtifacts()) {
105102
projectDependencyJars.add(artifact.getFile());
106103
}
@@ -142,20 +139,44 @@ private void addGradleFiles(Project project) {
142139
skaffoldFilesOutput.addBuild(project.getBuildFile().toPath());
143140

144141
// Add settings.gradle
145-
if (GradleVersion.current().compareTo(GRADLE_9) < 0
146-
&& project.getGradle().getStartParameter().getSettingsFile() != null) {
147-
skaffoldFilesOutput.addBuild(
148-
project.getGradle().getStartParameter().getSettingsFile().toPath());
149-
} else if (Files.exists(projectPath.resolve(Settings.DEFAULT_SETTINGS_FILE))) {
150-
skaffoldFilesOutput.addBuild(projectPath.resolve(Settings.DEFAULT_SETTINGS_FILE));
151-
}
142+
addSettingsFile(project, projectPath);
152143

153144
// Add gradle.properties
154145
if (Files.exists(projectPath.resolve("gradle.properties"))) {
155146
skaffoldFilesOutput.addBuild(projectPath.resolve("gradle.properties"));
156147
}
157148
}
158149

150+
/**
151+
* Adds the settings.gradle file for a project.
152+
*
153+
* <p>Uses reflection to call getSettingsFile() for compatibility with both Gradle 6 and 9
154+
* (getSettingsFile() was removed in Gradle 9).
155+
*
156+
* @param project the project
157+
* @param projectPath the project directory path
158+
*/
159+
private void addSettingsFile(Project project, Path projectPath) {
160+
boolean settingsFileAdded = false;
161+
try {
162+
Object startParameter = project.getGradle().getStartParameter();
163+
java.lang.reflect.Method getSettingsFileMethod =
164+
startParameter.getClass().getMethod("getSettingsFile");
165+
File settingsFile = (File) getSettingsFileMethod.invoke(startParameter);
166+
if (settingsFile != null) {
167+
skaffoldFilesOutput.addBuild(settingsFile.toPath());
168+
settingsFileAdded = true;
169+
}
170+
} catch (ReflectiveOperationException e) {
171+
// Fall through to default settings file check
172+
}
173+
174+
// Fall back to default settings file location if not already added
175+
if (!settingsFileAdded && Files.exists(projectPath.resolve(Settings.DEFAULT_SETTINGS_FILE))) {
176+
skaffoldFilesOutput.addBuild(projectPath.resolve(Settings.DEFAULT_SETTINGS_FILE));
177+
}
178+
}
179+
159180
/**
160181
* Prints build files, sources, and resources associated with a project.
161182
*
@@ -212,7 +233,7 @@ private Set<ProjectDependency> findProjectDependencies(Project project) {
212233
// If this is a project dependency, save it
213234
ProjectDependency projectDependency = (ProjectDependency) dependency;
214235
if (!projectDependencies.contains(projectDependency)) {
215-
projects.push(projectDependency.getDependencyProject());
236+
projects.push(getDependentProject(projectDependency));
216237
projectDependencies.add(projectDependency);
217238
}
218239
}
@@ -222,4 +243,37 @@ private Set<ProjectDependency> findProjectDependencies(Project project) {
222243
}
223244
return projectDependencies;
224245
}
246+
247+
/**
248+
* Resolves a {@link ProjectDependency} to its corresponding {@link Project} instance.
249+
*
250+
* <p>Uses reflection to handle both Gradle 6 (getDependencyProject()) and Gradle 9+ (getPath()).
251+
*
252+
* @param projectDependency the project dependency to resolve
253+
* @return the resolved project
254+
* @throws RuntimeException if the dependent project could not be resolved
255+
*/
256+
private Project getDependentProject(ProjectDependency projectDependency) {
257+
// Try getDependencyProject() first (Gradle 6-8)
258+
try {
259+
java.lang.reflect.Method getDependencyProjectMethod =
260+
projectDependency.getClass().getMethod("getDependencyProject");
261+
return (Project) getDependencyProjectMethod.invoke(projectDependency);
262+
} catch (NoSuchMethodException e) {
263+
// Fall through to getPath() approach (Gradle 9+)
264+
} catch (ReflectiveOperationException e) {
265+
throw new RuntimeException(
266+
"Failed to resolve dependent project from " + projectDependency, e);
267+
}
268+
269+
// Try getPath() approach (Gradle 9+)
270+
try {
271+
java.lang.reflect.Method getPathMethod = projectDependency.getClass().getMethod("getPath");
272+
String path = (String) getPathMethod.invoke(projectDependency);
273+
return getProject().project(path);
274+
} catch (ReflectiveOperationException e) {
275+
throw new RuntimeException(
276+
"Failed to resolve dependent project from " + projectDependency, e);
277+
}
278+
}
225279
}

0 commit comments

Comments
 (0)