You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by st...@apache.org on 2006/10/27 01:10:11 UTC

svn commit: r468180 - in /ant/core/trunk: docs/manual/CoreTasks/war.html src/main/org/apache/tools/ant/taskdefs/War.java src/tests/antunit/taskdefs/war-test.xml src/tests/antunit/taskdefs/web.xml

Author: stevel
Date: Thu Oct 26 16:10:10 2006
New Revision: 468180

URL: http://svn.apache.org/viewvc?view=rev&rev=468180
Log:
web.xml is now optional in Java EE. I've tweaked <war> to warn but continue if it is omitted, and not to say anything if there is a duplicate reference to the same web.xml, but to complain a lot if there are two conflicting ones (with diagnostics). 

We may want to have an attribute to indicate that a web.xml file is needed, or that we dont want to see the warning message. Say nowebxml="fail", "warn" or "skip", with the default being fail for backwards compatibility. Thoughts? Now is the time to add it...

Added:
    ant/core/trunk/src/tests/antunit/taskdefs/war-test.xml
    ant/core/trunk/src/tests/antunit/taskdefs/web.xml
Modified:
    ant/core/trunk/docs/manual/CoreTasks/war.html
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/War.java

Modified: ant/core/trunk/docs/manual/CoreTasks/war.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTasks/war.html?view=diff&rev=468180&r1=468179&r2=468180
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/war.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/war.html Thu Oct 26 16:10:10 2006
@@ -33,7 +33,20 @@
 <p>(The War task is a shortcut for specifying the particular layout of a WAR file.
 The same thing can be accomplished by using the <i>prefix</i> and <i>fullpath</i>
 attributes of zipfilesets in a Zip or Jar task.)</p>
-<p>The extended zipfileset element from the zip task (with attributes <i>prefix</i>, <i>fullpath</i>, and <i>src</i>) is available in the War task.</p>
+<p>The extended zipfileset element from the zip task
+    (with attributes <i>prefix</i>, <i>fullpath</i>, and <i>src</i>)
+    is available in the War task. The task is also resource-enabled
+    and will add nested resources and resource collections to the archive.</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. 
+</p>
+
 
 <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
@@ -55,13 +68,13 @@
   </tr>
   <tr>
     <td valign="top">warfile</td>
-    <td valign="top"><i>Deprecated<i> name of the file to create
+    <td valign="top"><i>Deprecated</i> name of the file to create
     -use <tt>destfile</tt> instead.</td>
   </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">Yes, unless update is set to true</td>
+    <td valign="top" align="center">No (since Ant1.7)</td>
   </tr>
   <tr>
     <td valign="top">basedir</td>
@@ -231,7 +244,7 @@
 directory, and thus it is our fault your webapp doesn't work. The cause
 of these complaints lies in WinZip, which turns an all upper-case
 directory into an all lower case one in a fit of helpfulness. Please check that
-jar xvf yourwebapp.war shows the same behaviour before filing another
+<code>jar xvf yourwebapp.war</code> shows the same behaviour before filing another
 report.<br/>
 Winzip has an option allowing all uppercase names (which is off by default!).  It can be enabled by:
 Menu "Options" -> "Configuration",  "View" property/tab page, then "General" group box has an option called "Allow all uppercase file names".

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/War.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/War.java?view=diff&rev=468180&r1=468179&r2=468180
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/War.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/War.java Thu Oct 26 16:10:10 2006
@@ -20,6 +20,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Locale;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.types.ZipFileSet;
@@ -55,8 +56,10 @@
      * flag set if the descriptor is added
      */
     private boolean descriptorAdded;
+    private File addedWebXmlFile;
 
     private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+    private static final String XML_DESCRIPTOR_PATH = "web-inf/web.xml";
 
     /** Constructor for the War Task. */
     public War() {
@@ -93,7 +96,7 @@
         // Create a ZipFileSet for this file, and pass it up.
         ZipFileSet fs = new ZipFileSet();
         fs.setFile(deploymentDescriptor);
-        fs.setFullpath("WEB-INF/web.xml");
+        fs.setFullpath(XML_DESCRIPTOR_PATH);
         super.addFileset(fs);
     }
 
@@ -137,16 +140,18 @@
      */
     protected void initZipOutputStream(ZipOutputStream zOut)
         throws IOException, BuildException {
-        // If no webxml file is specified, it's an error.
-        if (deploymentDescriptor == null && !isInUpdateMode()) {
-            throw new BuildException("webxml attribute is required", getLocation());
-        }
-
         super.initZipOutputStream(zOut);
     }
 
     /**
      * Overridden from Zip class to deal with web.xml
+     *
+     * Here are cases that can arise
+     * -not a web.xml file : add
+     * -first web.xml : add, remember we added it
+     * -same web.xml again: skip
+     * -alternate web.xml : warn and skip
+     *
      * @param file the file to add to the archive
      * @param zOut the stream to write to
      * @param vPath the name this entry shall have in the archive
@@ -160,29 +165,51 @@
         // not the one specified in the "webxml" attribute - or if
         // it's being added twice, meaning the same file is specified
         // by the "webxml" attribute and in a <fileset> element.
-        if (vPath.equalsIgnoreCase("WEB-INF/web.xml"))  {
-            if (deploymentDescriptor == null
-                || !FILE_UTILS.fileNameEquals(deploymentDescriptor, file)
-                || descriptorAdded) {
-                log("Warning: selected " + archiveType
-                    + " files include a WEB-INF/web.xml which will be ignored "
-                    + "(please use webxml attribute to "
-                    + archiveType + " task)", Project.MSG_WARN);
+        String vPathLowerCase = vPath.toLowerCase(Locale.ENGLISH);
+        //by default, we add the file.
+        boolean addFile = true;
+        if (XML_DESCRIPTOR_PATH.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
+                addFile = false;
+                //check to see if we warn or not
+                if (!FILE_UTILS.fileNameEquals(addedWebXmlFile, file)) {
+                    log("Warning: selected " + archiveType
+                            +" files include a second " +XML_DESCRIPTOR_PATH
+                            + " which will be ignored.\n"
+                            + "The duplicate entry is at " +file +'\n'
+                            + "The file that will be used is "
+                            + addedWebXmlFile,
+                            Project.MSG_WARN);
+                }
             } else {
-                super.zipFile(file, zOut, vPath, mode);
+                //no added file, yet
+                addedWebXmlFile=file;
+                //there is no web.xml file, so add it
+                addFile = true;
+                //and remember that we did
                 descriptorAdded = true;
+                deploymentDescriptor = file;
             }
-        } else {
+        }
+        if (addFile) {
             super.zipFile(file, zOut, vPath, mode);
         }
     }
 
+
     /**
      * Make sure we don't think we already have a web.xml next time this task
      * gets executed.
      */
     protected void cleanUp() {
-        descriptorAdded = false;
+        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");
+        }
+        addedWebXmlFile = null;
         super.cleanUp();
     }
 }

Added: ant/core/trunk/src/tests/antunit/taskdefs/war-test.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/war-test.xml?view=auto&rev=468180
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/war-test.xml (added)
+++ ant/core/trunk/src/tests/antunit/taskdefs/war-test.xml Thu Oct 26 16:10:10 2006
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+
+<project name="war-test" basedir="." default="all"
+       xmlns:au="antlib:org.apache.ant.antunit">
+  <property name="working.dir" value="working"/>
+
+  <target name="all">
+    <au:antunit>
+      <fileset file="${ant.file}"/>
+      <au:plainlistener/>
+    </au:antunit>
+  </target>
+
+
+  <target name="init">
+    <delete dir="${working.dir}"/>
+    <mkdir dir="${working.dir}"/>
+    <property name="warfile" location="${working.dir}/test.war"/>
+    <property name="web.xml" location="web.xml"/>
+    <property name="webxml.generated" location="${working.dir}/WEB-INF/web.xml"/>
+
+    <!--failing on duplicates is half our testing-->
+    <presetdef name="mkwar">
+      <war destfile="${warfile}" duplicate="fail"/>
+    </presetdef>
+    <presetdef name="expandwar">
+      <unzip src="${working.dir}/test.war" dest="${working.dir}"/>
+    </presetdef>
+  </target>
+
+  <target name="tearDown">
+    <delete dir="${working.dir}"/>
+  </target>
+
+  <!--test that you can patch a fileset reference into a lib element-->
+  <target name="testlibrefs" depends="init">
+    <mkwar webxml="${web.xml}">
+      <fileset id="test" dir="." includes="web.xml"/>
+      <lib refid="test"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${webxml.generated}" />
+  </target>
+
+  <!-- 
+  This checks that as of Java EE 5, the web.xml attr is optional.
+  Here there is a web.xml, in the webinf fileset, rather than a fileset
+  -->
+  <target name="testWebXmlInWebinf" depends="init">
+    <mkwar>
+      <webinf dir="." includes="web.xml"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${webxml.generated}" />
+  </target>
+
+
+  <target name="testDuplicateWebXml" depends="init">
+    <mkwar webxml="${web.xml}" >
+      <webinf dir="." includes="web.xml"/>
+      <webinf file="${web.xml}"/>
+      <zipfileset file="${web.xml}" prefix="WEB-INF"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${webxml.generated}" />
+  </target>
+
+  <target name="testDifferentDuplicateWebXml" depends="init">
+    <copy file="${web.xml}" todir="${working.dir}" />
+    <mkwar webxml="${web.xml}" >
+      <webinf dir="${working.dir}" includes="web.xml"/>
+      <webinf file="${web.xml}"/>
+      <zipfileset file="${web.xml}" prefix="WEB-INF"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${webxml.generated}" />
+    <au:assertLogContains text="The duplicate entry is"/>
+  </target>
+
+
+  <!--
+    this target does not have a web.xml file.
+    Instead it pulls in
+  -->
+  <target name="testWebXmlOptional" depends="init">
+    <mkwar >
+      <classes dir="." includes="web.xml"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${working.dir}/WEB-INF/classes/web.xml" />
+    <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="testClassesElement" depends="init">
+    <mkwar >
+      <classes dir="." includes="web.xml"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${working.dir}/WEB-INF/classes/web.xml" />
+  </target>
+
+  <target name="testLibElement" depends="init">
+    <mkwar >
+      <lib dir="." includes="web.xml"/>
+    </mkwar>
+    <expandwar/>
+    <au:assertFileExists file="${working.dir}/WEB-INF/lib/web.xml" />
+  </target>
+
+</project>

Added: ant/core/trunk/src/tests/antunit/taskdefs/web.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/web.xml?view=auto&rev=468180
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/web.xml (added)
+++ ant/core/trunk/src/tests/antunit/taskdefs/web.xml Thu Oct 26 16:10:10 2006
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+         version="2.5" metadata-complete="true">
+
+</web-app>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org