diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java index e5e482d355..116c7a18f7 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2.java @@ -91,16 +91,16 @@ public void listFiles() throws IOException { Set projectDependencyJars = new HashSet<>(); for (ProjectDependency projectDependency : projectDependencies) { - addProjectFiles(projectDependency.getDependencyProject()); + Project dependentProject = getDependentProject(projectDependency); + addProjectFiles(dependentProject); // Keep track of project dependency jars for filtering out later String configurationName = projectDependency.getTargetConfiguration(); if (configurationName == null) { configurationName = "default"; } - Project dependencyProject = projectDependency.getDependencyProject(); for (Configuration targetConfiguration : - dependencyProject.getConfigurations().getByName(configurationName).getHierarchy()) { + dependentProject.getConfigurations().getByName(configurationName).getHierarchy()) { for (PublishArtifact artifact : targetConfiguration.getArtifacts()) { projectDependencyJars.add(artifact.getFile()); } @@ -142,8 +142,7 @@ private void addGradleFiles(Project project) { skaffoldFilesOutput.addBuild(project.getBuildFile().toPath()); // Add settings.gradle - if (GradleVersion.current().compareTo(GRADLE_9) < 0 - && project.getGradle().getStartParameter().getSettingsFile() != null) { + if (isBeforeGradle9() && project.getGradle().getStartParameter().getSettingsFile() != null) { skaffoldFilesOutput.addBuild( project.getGradle().getStartParameter().getSettingsFile().toPath()); } else if (Files.exists(projectPath.resolve(Settings.DEFAULT_SETTINGS_FILE))) { @@ -212,7 +211,7 @@ private Set findProjectDependencies(Project project) { // If this is a project dependency, save it ProjectDependency projectDependency = (ProjectDependency) dependency; if (!projectDependencies.contains(projectDependency)) { - projects.push(projectDependency.getDependencyProject()); + projects.push(getDependentProject(projectDependency)); projectDependencies.add(projectDependency); } } @@ -222,4 +221,36 @@ private Set findProjectDependencies(Project project) { } return projectDependencies; } + + /** + * Resolves a {@link ProjectDependency} to its corresponding {@link Project} instance. + * + *

This method handles the removal of {@code ProjectDependency.getDependencyProject()} in + * Gradle 9.0 by falling back to {@code getPath()} and resolving it via the project hierarchy. + * + * @param projectDependency the project dependency to resolve + * @return the resolved project + * @throws RuntimeException if the dependent project could not be resolved + */ + private Project getDependentProject(ProjectDependency projectDependency) { + if (isBeforeGradle9()) { + return projectDependency.getDependencyProject(); + } + try { + String path = + (String) projectDependency.getClass().getMethod("getPath").invoke(projectDependency); + return getProject().project(path); + } catch (ReflectiveOperationException ex) { + throw new RuntimeException("Failed to get dependent project from " + projectDependency, ex); + } + } + + /** + * Checks if the current Gradle version is older than 9.0. + * + * @return {@code true} if the current Gradle version is less than 9.0, {@code false} otherwise + */ + private static boolean isBeforeGradle9() { + return GradleVersion.current().compareTo(GRADLE_9) < 0; + } } diff --git a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2Test.java b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2Test.java index 3df3a86154..3c35549813 100644 --- a/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2Test.java +++ b/jib-gradle-plugin/src/test/java/com/google/cloud/tools/jib/gradle/skaffold/FilesTaskV2Test.java @@ -46,6 +46,10 @@ public class FilesTaskV2Test { @ClassRule public static final TestProject multiTestProject = new TestProject("multi-service"); + @ClassRule + public static final TestProject multiTestProjectGradle9 = + new TestProject("multi-service").withGradleVersion("9.0"); + @ClassRule public static final TestProject platformProject = new TestProject("platform").withGradleVersion("5.2"); @@ -188,4 +192,33 @@ public void testFilesTast_withConfigModifiers() throws IOException { assertPathListsAreEqual( ImmutableList.of(projectRoot.resolve("src/main/jib/bar")), result.getIgnore()); } + + @Test + public void testFilesTask_multiProjectComplexService_gradle9() throws IOException { + Path projectRoot = multiTestProjectGradle9.getProjectRoot(); + Path complexServiceRoot = projectRoot.resolve("complex-service"); + Path libRoot = projectRoot.resolve("lib"); + SkaffoldFilesOutput result = + new SkaffoldFilesOutput(verifyTaskSuccess(multiTestProjectGradle9, "complex-service")); + assertPathListsAreEqual( + ImmutableList.of( + projectRoot.resolve("build.gradle"), + projectRoot.resolve("settings.gradle"), + projectRoot.resolve("gradle.properties"), + complexServiceRoot.resolve("build.gradle"), + libRoot.resolve("build.gradle")), + result.getBuild()); + assertPathListsAreEqual( + ImmutableList.of( + complexServiceRoot.resolve("src/main/extra-resources-1"), + complexServiceRoot.resolve("src/main/extra-resources-2"), + complexServiceRoot.resolve("src/main/java"), + complexServiceRoot.resolve("src/main/other-jib"), + libRoot.resolve("src/main/resources"), + libRoot.resolve("src/main/java"), + complexServiceRoot.resolve( + "local-m2-repo/com/google/cloud/tools/tiny-test-lib/0.0.1-SNAPSHOT/tiny-test-lib-0.0.1-SNAPSHOT.jar")), + result.getInputs()); + assertThat(result.getIgnore()).isEmpty(); + } }