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 */
4343public 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}
0 commit comments