Commit 53be0f8d authored by Andy Wilkinson's avatar Andy Wilkinson

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
parent e306cff4
...@@ -37,40 +37,27 @@ import static org.junit.Assert.assertTrue; ...@@ -37,40 +37,27 @@ import static org.junit.Assert.assertTrue;
/** /**
* Tests for war packaging with Gradle to ensure that only the Servlet container and its * Tests for war packaging with Gradle to ensure that only the Servlet container and its
* dependencies are packaged in WEB-INF/lib-provided * dependencies are packaged in WEB-INF/lib-provided
* *
* @author Andy Wilkinson * @author Andy Wilkinson
*/ */
public class WarPackagingTests { public class WarPackagingTests {
private static final String WEB_INF_LIB_PROVIDED_PREFIX = "WEB-INF/lib-provided/"; private static final String WEB_INF_LIB_PROVIDED_PREFIX = "WEB-INF/lib-provided/";
private static final String WEB_INF_LIB_PREFIX = "WEB-INF/lib/";
private static final Set<String> TOMCAT_EXPECTED_IN_WEB_INF_LIB_PROVIDED = new HashSet<String>( private static final Set<String> TOMCAT_EXPECTED_IN_WEB_INF_LIB_PROVIDED = new HashSet<String>(
Arrays.asList(WEB_INF_LIB_PROVIDED_PREFIX + "spring-boot-starter-tomcat-", Arrays.asList("spring-boot-starter-tomcat-", "tomcat-embed-core-",
WEB_INF_LIB_PROVIDED_PREFIX + "tomcat-embed-core-", "tomcat-embed-el-", "tomcat-embed-logging-juli-"));
WEB_INF_LIB_PROVIDED_PREFIX + "tomcat-embed-el-",
WEB_INF_LIB_PROVIDED_PREFIX + "tomcat-embed-logging-juli-"));
private static final Set<String> JETTY_EXPECTED_IN_WEB_INF_LIB_PROVIDED = new HashSet<String>( private static final Set<String> JETTY_EXPECTED_IN_WEB_INF_LIB_PROVIDED = new HashSet<String>(
Arrays.asList(WEB_INF_LIB_PROVIDED_PREFIX + "spring-boot-starter-jetty-", Arrays.asList("spring-boot-starter-jetty-", "jetty-util-", "jetty-xml-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-util-", "javax.servlet-", "jetty-continuation-", "jetty-io-", "jetty-http-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-xml-", "jetty-server-", "jetty-security-", "jetty-servlet-",
WEB_INF_LIB_PROVIDED_PREFIX + "javax.servlet-", "jetty-webapp-", "javax.servlet.jsp-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-continuation-", "org.apache.jasper.glassfish-", "javax.servlet.jsp.jstl-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-io-", "org.apache.taglibs.standard.glassfish-", "javax.el-", "com.sun.el-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-http-", "org.eclipse.jdt.core-", "jetty-jsp-"));
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-server-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-security-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-servlet-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-webapp-",
WEB_INF_LIB_PROVIDED_PREFIX + "javax.servlet.jsp-",
WEB_INF_LIB_PROVIDED_PREFIX + "org.apache.jasper.glassfish-",
WEB_INF_LIB_PROVIDED_PREFIX + "javax.servlet.jsp.jstl-",
WEB_INF_LIB_PROVIDED_PREFIX
+ "org.apache.taglibs.standard.glassfish-",
WEB_INF_LIB_PROVIDED_PREFIX + "javax.el-",
WEB_INF_LIB_PROVIDED_PREFIX + "com.sun.el-",
WEB_INF_LIB_PROVIDED_PREFIX + "org.eclipse.jdt.core-",
WEB_INF_LIB_PROVIDED_PREFIX + "jetty-jsp-"));
private static final String BOOT_VERSION = ManagedDependencies.get() private static final String BOOT_VERSION = ManagedDependencies.get()
.find("spring-boot").getVersion(); .find("spring-boot").getVersion();
...@@ -84,24 +71,32 @@ public class WarPackagingTests { ...@@ -84,24 +71,32 @@ public class WarPackagingTests {
@Test @Test
public void onlyTomcatIsPackackedInWebInfLibProvided() throws IOException { public void onlyTomcatIsPackackedInWebInfLibProvided() throws IOException {
checkWebInfLibProvidedEntriesForServletContainer("tomcat", checkWebInfEntriesForServletContainer("tomcat",
TOMCAT_EXPECTED_IN_WEB_INF_LIB_PROVIDED); TOMCAT_EXPECTED_IN_WEB_INF_LIB_PROVIDED);
} }
@Test @Test
public void onlyJettyIsPackackedInWebInfLibProvided() throws IOException { public void onlyJettyIsPackackedInWebInfLibProvided() throws IOException {
checkWebInfLibProvidedEntriesForServletContainer("jetty", checkWebInfEntriesForServletContainer("jetty",
JETTY_EXPECTED_IN_WEB_INF_LIB_PROVIDED); JETTY_EXPECTED_IN_WEB_INF_LIB_PROVIDED);
} }
private void checkWebInfLibProvidedEntriesForServletContainer( private void checkWebInfEntriesForServletContainer(String servletContainer,
String servletContainer, Set<String> expectedEntries) throws IOException { Set<String> expectedLibProvidedEntries) throws IOException {
project.newBuild() project.newBuild()
.forTasks("clean", "build") .forTasks("clean", "build")
.withArguments("-PbootVersion=" + BOOT_VERSION, .withArguments("-PbootVersion=" + BOOT_VERSION,
"-PservletContainer=" + servletContainer).run(); "-PservletContainer=" + servletContainer).run();
JarFile war = new JarFile("target/war-packaging/build/libs/war-packaging.war"); JarFile war = new JarFile("target/war-packaging/build/libs/war-packaging.war");
checkWebInfLibProvidedEntries(war, expectedLibProvidedEntries);
checkWebInfLibEntries(war, expectedLibProvidedEntries);
}
private void checkWebInfLibProvidedEntries(JarFile war, Set<String> expectedEntries)
throws IOException {
Set<String> entries = getWebInfLibProvidedEntries(war); Set<String> entries = getWebInfLibProvidedEntries(war);
assertEquals( assertEquals(
...@@ -118,6 +113,21 @@ public class WarPackagingTests { ...@@ -118,6 +113,21 @@ public class WarPackagingTests {
+ unexpectedLibProvidedEntries, unexpectedLibProvidedEntries.isEmpty()); + unexpectedLibProvidedEntries, unexpectedLibProvidedEntries.isEmpty());
} }
private void checkWebInfLibEntries(JarFile war, Set<String> entriesOnlyInLibProvided)
throws IOException {
Set<String> entries = getWebInfLibEntries(war);
List<String> unexpectedLibEntries = new ArrayList<String>();
for (String entry : entries) {
if (!isExpectedInWebInfLib(entry, entriesOnlyInLibProvided)) {
unexpectedLibEntries.add(entry);
}
}
assertTrue("Found unexpected entries in WEB-INF/lib: " + unexpectedLibEntries,
unexpectedLibEntries.isEmpty());
}
private Set<String> getWebInfLibProvidedEntries(JarFile war) throws IOException { private Set<String> getWebInfLibProvidedEntries(JarFile war) throws IOException {
Set<String> webInfLibProvidedEntries = new HashSet<String>(); Set<String> webInfLibProvidedEntries = new HashSet<String>();
Enumeration<JarEntry> entries = war.entries(); Enumeration<JarEntry> entries = war.entries();
...@@ -130,17 +140,42 @@ public class WarPackagingTests { ...@@ -130,17 +140,42 @@ public class WarPackagingTests {
return webInfLibProvidedEntries; return webInfLibProvidedEntries;
} }
private Set<String> getWebInfLibEntries(JarFile war) throws IOException {
Set<String> webInfLibEntries = new HashSet<String>();
Enumeration<JarEntry> entries = war.entries();
while (entries.hasMoreElements()) {
String name = entries.nextElement().getName();
if (isWebInfLibEntry(name)) {
webInfLibEntries.add(name);
}
}
return webInfLibEntries;
}
private boolean isWebInfLibProvidedEntry(String name) { private boolean isWebInfLibProvidedEntry(String name) {
return name.startsWith(WEB_INF_LIB_PROVIDED_PREFIX) return name.startsWith(WEB_INF_LIB_PROVIDED_PREFIX)
&& !name.equals(WEB_INF_LIB_PROVIDED_PREFIX); && !name.equals(WEB_INF_LIB_PROVIDED_PREFIX);
} }
private boolean isWebInfLibEntry(String name) {
return name.startsWith(WEB_INF_LIB_PREFIX) && !name.equals(WEB_INF_LIB_PREFIX);
}
private boolean isExpectedInWebInfLibProvided(String name, Set<String> expectedEntries) { private boolean isExpectedInWebInfLibProvided(String name, Set<String> expectedEntries) {
for (String expected : expectedEntries) { for (String expected : expectedEntries) {
if (name.startsWith(expected)) { if (name.startsWith(WEB_INF_LIB_PROVIDED_PREFIX + expected)) {
return true; return true;
} }
} }
return false; return false;
} }
private boolean isExpectedInWebInfLib(String name, Set<String> unexpectedEntries) {
for (String unexpected : unexpectedEntries) {
if (name.startsWith(WEB_INF_LIB_PREFIX + unexpected)) {
return false;
}
}
return true;
}
} }
...@@ -112,7 +112,7 @@ class ProjectLibraries implements Libraries { ...@@ -112,7 +112,7 @@ class ProjectLibraries implements Libraries {
} }
Set<ResolvedArtifact> result = new LinkedHashSet<ResolvedArtifact>(); Set<ResolvedArtifact> result = new LinkedHashSet<ResolvedArtifact>();
for (ResolvedArtifact artifact : source) { for (ResolvedArtifact artifact : source) {
if (!toRemove.contains(artifact.getFile())) { if (!filesToRemove.contains(artifact.getFile())) {
result.add(artifact); result.add(artifact);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment