More tests, especially for updates. One test is disabled because it fails. The task fails if you are pulling in a web.xml on an existing web.xml file via a fileset if update=false, because the fileset version checking is hiding the inclusion of the web.xml file from the war task -its being dropped before we notice. This is not a BC problem. Maybe I should always make web.xml mandatory to stop this behavior arising. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@468568 13f79535-47bb-0310-9956-ffa450edef68master
@@ -28,9 +28,8 @@ Other changes: | |||||
Bugzilla 40019. | Bugzilla 40019. | ||||
* <war> task now allows you to omit the web.xml file. as this is optional | * <war> task now allows you to omit the web.xml file. as this is optional | ||||
in the servlet 2.5 and Java EE 5 APIs. If you do want a web.xml file, it | |||||
can be pulled in by any nested fileset or resource reference; the webxml | |||||
attribute is optional. | |||||
in the servlet 2.5 and Java EE 5 APIs. set needxmlfile="false" to | |||||
avoid a missing web.xml file from halting the build. | |||||
* Diagnostics catches and logs security exceptions when accessing system properties. | * Diagnostics catches and logs security exceptions when accessing system properties. | ||||
@@ -41,14 +41,17 @@ attributes of zipfilesets in a Zip or Jar task.)</p> | |||||
<p> | <p> | ||||
Before Servlet API 2.5/Java EE 5, a WEB-INF/web.xml file was mandatory in a | Before Servlet API 2.5/Java EE 5, a WEB-INF/web.xml file was mandatory in a | ||||
WAR file, so this task failed if the <code>webxml</code> attribute was missing. | WAR file, so this task failed if the <code>webxml</code> attribute was missing. | ||||
As the web.xml file is now optional, the <code>webxml</code> attribute is now | |||||
downgraded to being optional. The task will warn if the file is not | |||||
included as an attribute or in a fileset, but still succeed. The task | |||||
will also complain if more than one web.xml file is added to the JAR. | |||||
As the web.xml file is now optional, the <code>webxml</code> attribute may now | |||||
be made optional. However, as most real web applications do need a web.xml file, | |||||
it is not optional by default. The task will fail if the file is not | |||||
included, unless the <code>needxmlfile</code> attribute | |||||
is set to <code>true</code>. The task | |||||
will warn if more than one web.xml file is added to the JAR | |||||
through the filesets. | |||||
</p> | </p> | ||||
<p><b>Please note that the zip format allows multiple files of the same | |||||
<p><b>Please note that the Zip format allows multiple files of the same | |||||
fully-qualified name to exist within a single archive. This has been | fully-qualified name to exist within a single archive. This has been | ||||
documented as causing various problems for unsuspecting users. If you wish | documented as causing various problems for unsuspecting users. If you wish | ||||
to avoid this behavior you must set the <code>duplicate</code> attribute | to avoid this behavior you must set the <code>duplicate</code> attribute | ||||
@@ -73,8 +76,18 @@ to a value other than its default, <code>"add"</code>.</b></p> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">webxml</td> | <td valign="top">webxml</td> | ||||
<td valign="top">The deployment descriptor to use (WEB-INF/web.xml).</td> | |||||
<td valign="top" align="center">No (since Ant1.7)</td> | |||||
<td valign="top">The servlet configuration descriptor to use (WEB-INF/web.xml).</td> | |||||
<td valign="top" align="center">Yes, unless <tt>needxmlfile</tt> is true, | |||||
the file is pulled in via a nested fileset, or an existing WAR file is | |||||
being updated.</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">needxmlfile</td> | |||||
<td valign="top">Flag to indicate whether or not the web.xml file is needed. | |||||
I=it should be set to false when generating | |||||
servlet 2.5+ WAR files without a web.xml file. | |||||
<em>Since Ant 1.7</em></td> | |||||
<td valign="top" align="center">No -default "true"</td> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">basedir</td> | <td valign="top">basedir</td> | ||||
@@ -55,11 +55,15 @@ public class War extends Jar { | |||||
/** | /** | ||||
* flag set if the descriptor is added | * flag set if the descriptor is added | ||||
*/ | */ | ||||
private boolean descriptorAdded; | |||||
private boolean needxmlfile=true; | |||||
private File addedWebXmlFile; | private File addedWebXmlFile; | ||||
private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | ||||
private static final String XML_DESCRIPTOR_PATH = "web-inf/web.xml"; | |||||
/** path to web.xml file */ | |||||
private static final String XML_DESCRIPTOR_PATH = "WEB-INF/web.xml"; | |||||
/** lower case version for comparisons */ | |||||
private static final String XML_DESCRIPTOR_PATH_LC = | |||||
XML_DESCRIPTOR_PATH.toLowerCase(Locale.ENGLISH); | |||||
/** Constructor for the War Task. */ | /** Constructor for the War Task. */ | ||||
public War() { | public War() { | ||||
@@ -100,6 +104,15 @@ public class War extends Jar { | |||||
super.addFileset(fs); | super.addFileset(fs); | ||||
} | } | ||||
/** | |||||
* Set the policy on the web.xml file, that is, whether or not it is needed | |||||
* @param needxmlfile whether a web.xml file is needed. Default: true | |||||
*/ | |||||
public void setNeedxmlfile(boolean needxmlfile) { | |||||
this.needxmlfile = needxmlfile; | |||||
} | |||||
/** | /** | ||||
* add files under WEB-INF/lib/ | * add files under WEB-INF/lib/ | ||||
* @param fs the zip file set to add | * @param fs the zip file set to add | ||||
@@ -168,7 +181,7 @@ public class War extends Jar { | |||||
String vPathLowerCase = vPath.toLowerCase(Locale.ENGLISH); | String vPathLowerCase = vPath.toLowerCase(Locale.ENGLISH); | ||||
//by default, we add the file. | //by default, we add the file. | ||||
boolean addFile = true; | boolean addFile = true; | ||||
if (XML_DESCRIPTOR_PATH.equals(vPathLowerCase)) { | |||||
if (XML_DESCRIPTOR_PATH_LC.equals(vPathLowerCase)) { | |||||
//a web.xml file was found. See if it is a duplicate or not | //a web.xml file was found. See if it is a duplicate or not | ||||
if (addedWebXmlFile != null) { | if (addedWebXmlFile != null) { | ||||
//a second web.xml file, so skip it | //a second web.xml file, so skip it | ||||
@@ -189,7 +202,6 @@ public class War extends Jar { | |||||
//there is no web.xml file, so add it | //there is no web.xml file, so add it | ||||
addFile = true; | addFile = true; | ||||
//and remember that we did | //and remember that we did | ||||
descriptorAdded = true; | |||||
deploymentDescriptor = file; | deploymentDescriptor = file; | ||||
} | } | ||||
} | } | ||||
@@ -204,10 +216,9 @@ public class War extends Jar { | |||||
* gets executed. | * gets executed. | ||||
*/ | */ | ||||
protected void cleanUp() { | protected void cleanUp() { | ||||
if(addedWebXmlFile==null) { | |||||
log("No WEB-INF/web.xml file was added.\n" | |||||
+"This WAR file is only valid on Java EE 5+ runtimes\n" | |||||
+"and web servers that support v2.5 Web Applications"); | |||||
if(addedWebXmlFile==null && needxmlfile && !isInUpdateMode()) { | |||||
throw new BuildException("No WEB-INF/web.xml file was added.\n" | |||||
+"If this is your intent, set needxml='false' "); | |||||
} | } | ||||
addedWebXmlFile = null; | addedWebXmlFile = null; | ||||
super.cleanUp(); | super.cleanUp(); | ||||
@@ -54,6 +54,39 @@ | |||||
<au:assertFileExists file="${webxml.generated}" /> | <au:assertFileExists file="${webxml.generated}" /> | ||||
</target> | </target> | ||||
<target name="testWebXmlMissingFromUpdate" depends="init"> | |||||
<mkwar webxml="${web.xml}" /> | |||||
<!-- there is no web.xml file, but that is ok, as | |||||
we are updating --> | |||||
<mkwar update="true"> | |||||
<classes dir="." includes="web.xml"/> | |||||
</mkwar> | |||||
<expandwar/> | |||||
<au:assertFileExists file="${webxml.generated}" /> | |||||
</target> | |||||
<target name="testWebXmlInImplicitUpdate" depends="init"> | |||||
<mkwar webxml="${web.xml}" /> | |||||
<!-- when we are implicitly updating, the web.xml file does not get | |||||
pulled in, but the command still succeeds.--> | |||||
<mkwar webxml="${web.xml}" > | |||||
<classes dir="." includes="web.xml"/> | |||||
</mkwar> | |||||
<expandwar/> | |||||
<au:assertFileExists file="${webxml.generated}" /> | |||||
</target> | |||||
<target name="NotestWebXmlFilesetInImplicitUpdate" depends="init"> | |||||
<mkwar webxml="${web.xml}" /> | |||||
<!-- when we are implicitly updating, the web.xml file does not get | |||||
pulled in, but the command still succeeds.--> | |||||
<mkwar > | |||||
<webinf dir="." includes="web.xml"/> | |||||
</mkwar> | |||||
<expandwar/> | |||||
<au:assertFileExists file="${webxml.generated}" /> | |||||
</target> | |||||
<target name="testDuplicateWebXml" depends="init"> | <target name="testDuplicateWebXml" depends="init"> | ||||
<mkwar webxml="${web.xml}" > | <mkwar webxml="${web.xml}" > | ||||
@@ -83,7 +116,7 @@ | |||||
Instead it pulls in | Instead it pulls in | ||||
--> | --> | ||||
<target name="testWebXmlOptional" depends="init"> | <target name="testWebXmlOptional" depends="init"> | ||||
<mkwar > | |||||
<mkwar needxmlfile="false"> | |||||
<classes dir="." includes="web.xml"/> | <classes dir="." includes="web.xml"/> | ||||
</mkwar> | </mkwar> | ||||
<expandwar/> | <expandwar/> | ||||
@@ -91,11 +124,26 @@ | |||||
<au:assertFalse> | <au:assertFalse> | ||||
<available file="${webxml.generated}" /> | <available file="${webxml.generated}" /> | ||||
</au:assertFalse> | </au:assertFalse> | ||||
<au:assertLogContains text="This WAR file is only valid on Java EE 5+ runtimes"/> | |||||
</target> | |||||
<target name="testWebXmlOptionalFailure" depends="init"> | |||||
<au:expectfailure> | |||||
<mkwar > | |||||
<classes dir="." includes="web.xml"/> | |||||
</mkwar> | |||||
</au:expectfailure> | |||||
</target> | |||||
<target name="testWebXmlOptionalFailure2" depends="init"> | |||||
<au:expectfailure> | |||||
<mkwar needxmlfile="true"> | |||||
<classes dir="." includes="web.xml"/> | |||||
</mkwar> | |||||
</au:expectfailure> | |||||
</target> | </target> | ||||
<target name="testClassesElement" depends="init"> | <target name="testClassesElement" depends="init"> | ||||
<mkwar > | |||||
<mkwar needxmlfile="false"> | |||||
<classes dir="." includes="web.xml"/> | <classes dir="." includes="web.xml"/> | ||||
</mkwar> | </mkwar> | ||||
<expandwar/> | <expandwar/> | ||||
@@ -103,7 +151,7 @@ | |||||
</target> | </target> | ||||
<target name="testLibElement" depends="init"> | <target name="testLibElement" depends="init"> | ||||
<mkwar > | |||||
<mkwar needxmlfile="false"> | |||||
<lib dir="." includes="web.xml"/> | <lib dir="." includes="web.xml"/> | ||||
</mkwar> | </mkwar> | ||||
<expandwar/> | <expandwar/> | ||||