From bcd4c8eee20edaf4f9e71b3199dd36f5c0121101 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 1 Oct 2014 19:20:04 +0100 Subject: [PATCH] Produce a single library for multiple file dependencies on the same file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, the Gradle plugin’s ProjectLibraries produced a new library for every file dependency, even if the dependencies where on the same file. This would lead to a repackaging failure due to multiple libraries having the same name. This commit updates ProjectLibraries to treat file dependencies on the same file as a single library, thereby resolving the name clash. Fixes gh-1646 --- .../gradle/MultiProjectRepackagingTests.java | 30 +++++++++++------- .../build.gradle | 28 ++++++++++++++++ .../settings.gradle | 3 ++ .../build.gradle | 0 .../common/lib/foo.jar | Bin .../settings.gradle | 0 .../gradle/repackage/ProjectLibraries.java | 17 ++++++++++ 7 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/build.gradle create mode 100644 spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/settings.gradle rename spring-boot-integration-tests/src/test/resources/{multi-project-repackage => multi-project-transitive-file-dependency}/build.gradle (100%) rename spring-boot-integration-tests/src/test/resources/{multi-project-repackage => multi-project-transitive-file-dependency}/common/lib/foo.jar (100%) rename spring-boot-integration-tests/src/test/resources/{multi-project-repackage => multi-project-transitive-file-dependency}/settings.gradle (100%) diff --git a/spring-boot-integration-tests/src/test/java/org/springframework/boot/gradle/MultiProjectRepackagingTests.java b/spring-boot-integration-tests/src/test/java/org/springframework/boot/gradle/MultiProjectRepackagingTests.java index 37437791369..4d59a522f08 100644 --- a/spring-boot-integration-tests/src/test/java/org/springframework/boot/gradle/MultiProjectRepackagingTests.java +++ b/spring-boot-integration-tests/src/test/java/org/springframework/boot/gradle/MultiProjectRepackagingTests.java @@ -17,11 +17,9 @@ package org.springframework.boot.gradle; import java.io.File; -import java.io.IOException; import java.util.jar.JarFile; import org.gradle.tooling.ProjectConnection; -import org.junit.BeforeClass; import org.junit.Test; import org.springframework.boot.dependency.tools.ManagedDependencies; @@ -38,21 +36,31 @@ public class MultiProjectRepackagingTests { private static final String BOOT_VERSION = ManagedDependencies.get() .find("spring-boot").getVersion(); - private static ProjectConnection project; - - @BeforeClass - public static void createProject() throws IOException { - project = new ProjectCreator().createProject("multi-project-repackage"); - } - @Test public void repackageWithTransitiveFileDependency() throws Exception { + ProjectConnection project = new ProjectCreator() + .createProject("multi-project-transitive-file-dependency"); project.newBuild().forTasks("clean", "build") - .withArguments("-PbootVersion=" + BOOT_VERSION, "-Prepackage=true").run(); - File buildLibs = new File("target/multi-project-repackage/main/build/libs"); + .withArguments("-PbootVersion=" + BOOT_VERSION).run(); + File buildLibs = new File( + "target/multi-project-transitive-file-dependency/main/build/libs"); JarFile jarFile = new JarFile(new File(buildLibs, "main.jar")); assertThat(jarFile.getEntry("lib/commons-logging-1.1.3.jar"), notNullValue()); assertThat(jarFile.getEntry("lib/foo.jar"), notNullValue()); jarFile.close(); } + + @Test + public void repackageWithCommonFileDependency() throws Exception { + ProjectConnection project = new ProjectCreator() + .createProject("multi-project-common-file-dependency"); + project.newBuild().forTasks("clean", "build") + .withArguments("-PbootVersion=" + BOOT_VERSION).run(); + File buildLibs = new File( + "target/multi-project-common-file-dependency/build/libs"); + JarFile jarFile = new JarFile(new File(buildLibs, + "multi-project-common-file-dependency.jar")); + assertThat(jarFile.getEntry("lib/foo.jar"), notNullValue()); + jarFile.close(); + } } diff --git a/spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/build.gradle b/spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/build.gradle new file mode 100644 index 00000000000..cbd9079f600 --- /dev/null +++ b/spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/build.gradle @@ -0,0 +1,28 @@ +buildscript { + repositories { + mavenLocal() + } + dependencies { + classpath "org.springframework.boot:spring-boot-gradle-plugin:${project.bootVersion}" + } +} + +subprojects { + apply plugin: 'java' + + dependencies { + compile rootProject.files {'lib/foo.jar'} + } +} + +apply plugin: 'spring-boot' + +springBoot { + mainClass = 'foo.bar.Baz' +} + +dependencies { + compile project(':one') + compile project(':two') +} + diff --git a/spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/settings.gradle b/spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/settings.gradle new file mode 100644 index 00000000000..9ae3a92d296 --- /dev/null +++ b/spring-boot-integration-tests/src/test/resources/multi-project-common-file-dependency/settings.gradle @@ -0,0 +1,3 @@ + +include 'one' +include 'two' \ No newline at end of file diff --git a/spring-boot-integration-tests/src/test/resources/multi-project-repackage/build.gradle b/spring-boot-integration-tests/src/test/resources/multi-project-transitive-file-dependency/build.gradle similarity index 100% rename from spring-boot-integration-tests/src/test/resources/multi-project-repackage/build.gradle rename to spring-boot-integration-tests/src/test/resources/multi-project-transitive-file-dependency/build.gradle diff --git a/spring-boot-integration-tests/src/test/resources/multi-project-repackage/common/lib/foo.jar b/spring-boot-integration-tests/src/test/resources/multi-project-transitive-file-dependency/common/lib/foo.jar similarity index 100% rename from spring-boot-integration-tests/src/test/resources/multi-project-repackage/common/lib/foo.jar rename to spring-boot-integration-tests/src/test/resources/multi-project-transitive-file-dependency/common/lib/foo.jar diff --git a/spring-boot-integration-tests/src/test/resources/multi-project-repackage/settings.gradle b/spring-boot-integration-tests/src/test/resources/multi-project-transitive-file-dependency/settings.gradle similarity index 100% rename from spring-boot-integration-tests/src/test/resources/multi-project-repackage/settings.gradle rename to spring-boot-integration-tests/src/test/resources/multi-project-transitive-file-dependency/settings.gradle diff --git a/spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/ProjectLibraries.java b/spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/ProjectLibraries.java index 1a3e28e1b10..118538a821a 100644 --- a/spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/ProjectLibraries.java +++ b/spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/ProjectLibraries.java @@ -199,6 +199,23 @@ class ProjectLibraries implements Libraries { return name; } + @Override + public int hashCode() { + return getFile().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof GradleLibrary) { + return getFile().equals(((GradleLibrary) obj).getFile()); + } + return false; + } + + @Override + public String toString() { + return getFile().getAbsolutePath(); + } } /**