4141import org .gradle .api .tasks .SourceSet ;
4242import org .gradle .api .tasks .SourceSetContainer ;
4343import org .gradle .api .tasks .TaskAction ;
44- import org .gradle .util .GradleVersion ;
4544
4645/**
4746 * Prints out changing source dependencies on a project.
5150 */
5251public 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