Skip to content

Commit 53be0f8

Browse files
committed
Fix Gradle plugin logic for removing provided artifacts
The new ResolvedArtifact-based minus implementation was checking the wrong Set when deciding whether or not a ResolvedArtifact should be included in the result. This was leading to provided dependencies, that should have only been packaging in WEB-INF/lib-provided also being packaged in WEB-INF/lib. The WarPackaging tests have been updated. In addition to checking that WEB-INF/lib-provided does not contain anything that’s unexpected, they also verify the contents of WEB-INF/lib Fixes #1187
1 parent e306cff commit 53be0f8

File tree

2 files changed

+66
-31
lines changed
  • spring-boot-integration-tests/src/test/java/org/springframework/boot/gradle
  • spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage

2 files changed

+66
-31
lines changed

spring-boot-integration-tests/src/test/java/org/springframework/boot/gradle/WarPackagingTests.java

Lines changed: 65 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,27 @@
3737
/**
3838
* Tests for war packaging with Gradle to ensure that only the Servlet container and its
3939
* dependencies are packaged in WEB-INF/lib-provided
40-
*
40+
*
4141
* @author Andy Wilkinson
4242
*/
4343
public class WarPackagingTests {
4444

4545
private static final String WEB_INF_LIB_PROVIDED_PREFIX = "WEB-INF/lib-provided/";
4646

47+
private static final String WEB_INF_LIB_PREFIX = "WEB-INF/lib/";
48+
4749
private static final Set<String> TOMCAT_EXPECTED_IN_WEB_INF_LIB_PROVIDED = new HashSet<String>(
48-
Arrays.asList(WEB_INF_LIB_PROVIDED_PREFIX + "spring-boot-starter-tomcat-",
49-
WEB_INF_LIB_PROVIDED_PREFIX + "tomcat-embed-core-",
50-
WEB_INF_LIB_PROVIDED_PREFIX + "tomcat-embed-el-",
51-
WEB_INF_LIB_PROVIDED_PREFIX + "tomcat-embed-logging-juli-"));
50+
Arrays.asList("spring-boot-starter-tomcat-", "tomcat-embed-core-",
51+
"tomcat-embed-el-", "tomcat-embed-logging-juli-"));
5252

5353
private static final Set<String> JETTY_EXPECTED_IN_WEB_INF_LIB_PROVIDED = new HashSet<String>(
54-
Arrays.asList(WEB_INF_LIB_PROVIDED_PREFIX + "spring-boot-starter-jetty-",
55-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-util-",
56-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-xml-",
57-
WEB_INF_LIB_PROVIDED_PREFIX + "javax.servlet-",
58-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-continuation-",
59-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-io-",
60-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-http-",
61-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-server-",
62-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-security-",
63-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-servlet-",
64-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-webapp-",
65-
WEB_INF_LIB_PROVIDED_PREFIX + "javax.servlet.jsp-",
66-
WEB_INF_LIB_PROVIDED_PREFIX + "org.apache.jasper.glassfish-",
67-
WEB_INF_LIB_PROVIDED_PREFIX + "javax.servlet.jsp.jstl-",
68-
WEB_INF_LIB_PROVIDED_PREFIX
69-
+ "org.apache.taglibs.standard.glassfish-",
70-
WEB_INF_LIB_PROVIDED_PREFIX + "javax.el-",
71-
WEB_INF_LIB_PROVIDED_PREFIX + "com.sun.el-",
72-
WEB_INF_LIB_PROVIDED_PREFIX + "org.eclipse.jdt.core-",
73-
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-jsp-"));
54+
Arrays.asList("spring-boot-starter-jetty-", "jetty-util-", "jetty-xml-",
55+
"javax.servlet-", "jetty-continuation-", "jetty-io-", "jetty-http-",
56+
"jetty-server-", "jetty-security-", "jetty-servlet-",
57+
"jetty-webapp-", "javax.servlet.jsp-",
58+
"org.apache.jasper.glassfish-", "javax.servlet.jsp.jstl-",
59+
"org.apache.taglibs.standard.glassfish-", "javax.el-", "com.sun.el-",
60+
"org.eclipse.jdt.core-", "jetty-jsp-"));
7461

7562
private static final String BOOT_VERSION = ManagedDependencies.get()
7663
.find("spring-boot").getVersion();
@@ -84,24 +71,32 @@ public static void createProject() throws IOException {
8471

8572
@Test
8673
public void onlyTomcatIsPackackedInWebInfLibProvided() throws IOException {
87-
checkWebInfLibProvidedEntriesForServletContainer("tomcat",
74+
checkWebInfEntriesForServletContainer("tomcat",
8875
TOMCAT_EXPECTED_IN_WEB_INF_LIB_PROVIDED);
8976
}
9077

9178
@Test
9279
public void onlyJettyIsPackackedInWebInfLibProvided() throws IOException {
93-
checkWebInfLibProvidedEntriesForServletContainer("jetty",
80+
checkWebInfEntriesForServletContainer("jetty",
9481
JETTY_EXPECTED_IN_WEB_INF_LIB_PROVIDED);
9582
}
9683

97-
private void checkWebInfLibProvidedEntriesForServletContainer(
98-
String servletContainer, Set<String> expectedEntries) throws IOException {
84+
private void checkWebInfEntriesForServletContainer(String servletContainer,
85+
Set<String> expectedLibProvidedEntries) throws IOException {
9986
project.newBuild()
10087
.forTasks("clean", "build")
10188
.withArguments("-PbootVersion=" + BOOT_VERSION,
10289
"-PservletContainer=" + servletContainer).run();
10390

10491
JarFile war = new JarFile("target/war-packaging/build/libs/war-packaging.war");
92+
93+
checkWebInfLibProvidedEntries(war, expectedLibProvidedEntries);
94+
95+
checkWebInfLibEntries(war, expectedLibProvidedEntries);
96+
}
97+
98+
private void checkWebInfLibProvidedEntries(JarFile war, Set<String> expectedEntries)
99+
throws IOException {
105100
Set<String> entries = getWebInfLibProvidedEntries(war);
106101

107102
assertEquals(
@@ -118,6 +113,21 @@ private void checkWebInfLibProvidedEntriesForServletContainer(
118113
+ unexpectedLibProvidedEntries, unexpectedLibProvidedEntries.isEmpty());
119114
}
120115

116+
private void checkWebInfLibEntries(JarFile war, Set<String> entriesOnlyInLibProvided)
117+
throws IOException {
118+
Set<String> entries = getWebInfLibEntries(war);
119+
120+
List<String> unexpectedLibEntries = new ArrayList<String>();
121+
for (String entry : entries) {
122+
if (!isExpectedInWebInfLib(entry, entriesOnlyInLibProvided)) {
123+
unexpectedLibEntries.add(entry);
124+
}
125+
}
126+
127+
assertTrue("Found unexpected entries in WEB-INF/lib: " + unexpectedLibEntries,
128+
unexpectedLibEntries.isEmpty());
129+
}
130+
121131
private Set<String> getWebInfLibProvidedEntries(JarFile war) throws IOException {
122132
Set<String> webInfLibProvidedEntries = new HashSet<String>();
123133
Enumeration<JarEntry> entries = war.entries();
@@ -130,17 +140,42 @@ private Set<String> getWebInfLibProvidedEntries(JarFile war) throws IOException
130140
return webInfLibProvidedEntries;
131141
}
132142

143+
private Set<String> getWebInfLibEntries(JarFile war) throws IOException {
144+
Set<String> webInfLibEntries = new HashSet<String>();
145+
Enumeration<JarEntry> entries = war.entries();
146+
while (entries.hasMoreElements()) {
147+
String name = entries.nextElement().getName();
148+
if (isWebInfLibEntry(name)) {
149+
webInfLibEntries.add(name);
150+
}
151+
}
152+
return webInfLibEntries;
153+
}
154+
133155
private boolean isWebInfLibProvidedEntry(String name) {
134156
return name.startsWith(WEB_INF_LIB_PROVIDED_PREFIX)
135157
&& !name.equals(WEB_INF_LIB_PROVIDED_PREFIX);
136158
}
137159

160+
private boolean isWebInfLibEntry(String name) {
161+
return name.startsWith(WEB_INF_LIB_PREFIX) && !name.equals(WEB_INF_LIB_PREFIX);
162+
}
163+
138164
private boolean isExpectedInWebInfLibProvided(String name, Set<String> expectedEntries) {
139165
for (String expected : expectedEntries) {
140-
if (name.startsWith(expected)) {
166+
if (name.startsWith(WEB_INF_LIB_PROVIDED_PREFIX + expected)) {
141167
return true;
142168
}
143169
}
144170
return false;
145171
}
172+
173+
private boolean isExpectedInWebInfLib(String name, Set<String> unexpectedEntries) {
174+
for (String unexpected : unexpectedEntries) {
175+
if (name.startsWith(WEB_INF_LIB_PREFIX + unexpected)) {
176+
return false;
177+
}
178+
}
179+
return true;
180+
}
146181
}

spring-boot-tools/spring-boot-gradle-plugin/src/main/groovy/org/springframework/boot/gradle/repackage/ProjectLibraries.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ private Set<ResolvedArtifact> minus(Set<ResolvedArtifact> source,
112112
}
113113
Set<ResolvedArtifact> result = new LinkedHashSet<ResolvedArtifact>();
114114
for (ResolvedArtifact artifact : source) {
115-
if (!toRemove.contains(artifact.getFile())) {
115+
if (!filesToRemove.contains(artifact.getFile())) {
116116
result.add(artifact);
117117
}
118118
}

0 commit comments

Comments
 (0)