Browse Source

Made web.xml non optional again, as it was hiding too many bugs (e.g war files for tomcat 5), but added an attribute to make it optional.

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-ffa450edef68
master
Steve Loughran 18 years ago
parent
commit
14f760492c
4 changed files with 93 additions and 22 deletions
  1. +2
    -3
      WHATSNEW
  2. +20
    -7
      docs/manual/CoreTasks/war.html
  3. +19
    -8
      src/main/org/apache/tools/ant/taskdefs/War.java
  4. +52
    -4
      src/tests/antunit/taskdefs/war-test.xml

+ 2
- 3
WHATSNEW View File

@@ -28,9 +28,8 @@ Other changes:
Bugzilla 40019.

* <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.



+ 20
- 7
docs/manual/CoreTasks/war.html View File

@@ -41,14 +41,17 @@ attributes of zipfilesets in a Zip or Jar task.)</p>
<p>
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.
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><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
documented as causing various problems for unsuspecting users. If you wish
to avoid this behavior you must set the <code>duplicate</code> attribute
@@ -73,8 +76,18 @@ to a value other than its default, <code>&quot;add&quot;</code>.</b></p>
</tr>
<tr>
<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>
<td valign="top">basedir</td>


+ 19
- 8
src/main/org/apache/tools/ant/taskdefs/War.java View File

@@ -55,11 +55,15 @@ public class War extends Jar {
/**
* flag set if the descriptor is added
*/
private boolean descriptorAdded;
private boolean needxmlfile=true;
private File addedWebXmlFile;

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. */
public War() {
@@ -100,6 +104,15 @@ public class War extends Jar {
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/
* @param fs the zip file set to add
@@ -168,7 +181,7 @@ public class War extends Jar {
String vPathLowerCase = vPath.toLowerCase(Locale.ENGLISH);
//by default, we add the file.
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
if (addedWebXmlFile != null) {
//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
addFile = true;
//and remember that we did
descriptorAdded = true;
deploymentDescriptor = file;
}
}
@@ -204,10 +216,9 @@ public class War extends Jar {
* gets executed.
*/
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;
super.cleanUp();


+ 52
- 4
src/tests/antunit/taskdefs/war-test.xml View File

@@ -54,6 +54,39 @@
<au:assertFileExists file="${webxml.generated}" />
</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">
<mkwar webxml="${web.xml}" >
@@ -83,7 +116,7 @@
Instead it pulls in
-->
<target name="testWebXmlOptional" depends="init">
<mkwar >
<mkwar needxmlfile="false">
<classes dir="." includes="web.xml"/>
</mkwar>
<expandwar/>
@@ -91,11 +124,26 @@
<au:assertFalse>
<available file="${webxml.generated}" />
</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 name="testClassesElement" depends="init">
<mkwar >
<mkwar needxmlfile="false">
<classes dir="." includes="web.xml"/>
</mkwar>
<expandwar/>
@@ -103,7 +151,7 @@
</target>
<target name="testLibElement" depends="init">
<mkwar >
<mkwar needxmlfile="false">
<lib dir="." includes="web.xml"/>
</mkwar>
<expandwar/>


Loading…
Cancel
Save