git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277889 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -253,6 +253,9 @@ Other changes: | |||
| * Add else attribute to the condition task, which specifies an | |||
| optional alternate value to set the property to if the nested | |||
| condition evaluates to false. Bugzilla report 33074. | |||
| * Ant generated jar files should now be detected as jar files by | |||
| Solaris. Bugzilla Report 32649. | |||
| Fixed bugs: | |||
| ----------- | |||
| @@ -1,5 +1,5 @@ | |||
| /* | |||
| * Copyright 2000-2004 The Apache Software Foundation | |||
| * Copyright 2000-2005 The Apache Software Foundation | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| @@ -47,6 +47,8 @@ import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.types.ZipFileSet; | |||
| import org.apache.tools.zip.JarMarker; | |||
| import org.apache.tools.zip.ZipExtraField; | |||
| import org.apache.tools.zip.ZipOutputStream; | |||
| /** | |||
| @@ -130,6 +132,15 @@ public class Jar extends Zip { | |||
| */ | |||
| private Path indexJars; | |||
| /** | |||
| * Extra fields needed to make Solaris recognize the archive as a jar file. | |||
| * | |||
| * @since Ant 1.6.3 | |||
| */ | |||
| private ZipExtraField[] JAR_MARKER = new ZipExtraField[] { | |||
| JarMarker.getInstance() | |||
| }; | |||
| /** constructor */ | |||
| public Jar() { | |||
| super(); | |||
| @@ -382,7 +393,8 @@ public class Jar extends Zip { | |||
| Project.MSG_WARN); | |||
| } | |||
| zipDir(null, zOut, "META-INF/", ZipFileSet.DEFAULT_DIR_MODE); | |||
| zipDir(null, zOut, "META-INF/", ZipFileSet.DEFAULT_DIR_MODE, | |||
| JAR_MARKER); | |||
| // time to write the manifest | |||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||
| OutputStreamWriter osw = new OutputStreamWriter(baos, "UTF-8"); | |||
| @@ -47,6 +47,7 @@ import org.apache.tools.ant.util.IdentityMapper; | |||
| import org.apache.tools.ant.util.MergingMapper; | |||
| import org.apache.tools.ant.util.ResourceUtils; | |||
| import org.apache.tools.zip.ZipEntry; | |||
| import org.apache.tools.zip.ZipExtraField; | |||
| import org.apache.tools.zip.ZipFile; | |||
| import org.apache.tools.zip.ZipOutputStream; | |||
| @@ -1030,6 +1031,22 @@ public class Zip extends MatchingTask { | |||
| protected void zipDir(File dir, ZipOutputStream zOut, String vPath, | |||
| int mode) | |||
| throws IOException { | |||
| zipDir(dir, zOut, vPath, mode, null); | |||
| } | |||
| /** | |||
| * Add a directory to the zip stream. | |||
| * @param dir the directort to add to the archive | |||
| * @param zOut the stream to write to | |||
| * @param vPath the name this entry shall have in the archive | |||
| * @param mode the Unix permissions to set. | |||
| * @param extra ZipExtraFields to add | |||
| * @throws IOException on error | |||
| * @since Ant 1.6.3 | |||
| */ | |||
| protected void zipDir(File dir, ZipOutputStream zOut, String vPath, | |||
| int mode, ZipExtraField[] extra) | |||
| throws IOException { | |||
| if (addedDirs.get(vPath) != null) { | |||
| // don't add directories we've already added. | |||
| // no warning if we try, it is harmless in and of itself | |||
| @@ -1054,7 +1071,11 @@ public class Zip extends MatchingTask { | |||
| ze.setCrc (EMPTY_CRC); | |||
| ze.setUnixMode(mode); | |||
| zOut.putNextEntry (ze); | |||
| if (extra != null) { | |||
| ze.setExtraFields(extra); | |||
| } | |||
| zOut.putNextEntry(ze); | |||
| } | |||
| } | |||
| @@ -37,6 +37,7 @@ public class ExtraFieldUtils { | |||
| static { | |||
| implementations = new Hashtable(); | |||
| register(AsiExtraField.class); | |||
| register(JarMarker.class); | |||
| } | |||
| /** | |||
| @@ -0,0 +1,105 @@ | |||
| /* | |||
| * Copyright 2005 The Apache Software Foundation | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| */ | |||
| package org.apache.tools.zip; | |||
| import java.util.zip.ZipException; | |||
| /** | |||
| * If this extra field is added as the very first extra field of the | |||
| * archive, Solaris will consider it an executable jar file. | |||
| * | |||
| * @since Ant 1.6.3 | |||
| */ | |||
| public final class JarMarker implements ZipExtraField { | |||
| private static ZipShort ID = new ZipShort(0xCAFE); | |||
| private static ZipShort NULL = new ZipShort(0); | |||
| private static byte[] NO_BYTES = new byte[0]; | |||
| private static JarMarker DEFAULT = new JarMarker(); | |||
| public JarMarker() { | |||
| // empty | |||
| } | |||
| /** | |||
| * Since JarMarker is stateless we can always use the same instance. | |||
| */ | |||
| public static JarMarker getInstance() { | |||
| return DEFAULT; | |||
| } | |||
| /** | |||
| * The Header-ID. | |||
| * @return the header id | |||
| */ | |||
| public ZipShort getHeaderId() { | |||
| return ID; | |||
| } | |||
| /** | |||
| * Length of the extra field in the local file data - without | |||
| * Header-ID or length specifier. | |||
| * @return 0 | |||
| */ | |||
| public ZipShort getLocalFileDataLength() { | |||
| return NULL; | |||
| } | |||
| /** | |||
| * Length of the extra field in the central directory - without | |||
| * Header-ID or length specifier. | |||
| * @return 0 | |||
| */ | |||
| public ZipShort getCentralDirectoryLength() { | |||
| return NULL; | |||
| } | |||
| /** | |||
| * The actual data to put into local file data - without Header-ID | |||
| * or length specifier. | |||
| * @return the data | |||
| * @since 1.1 | |||
| */ | |||
| public byte[] getLocalFileDataData() { | |||
| return NO_BYTES; | |||
| } | |||
| /** | |||
| * The actual data to put central directory - without Header-ID or | |||
| * length specifier. | |||
| * @return the data | |||
| */ | |||
| public byte[] getCentralDirectoryData() { | |||
| return NO_BYTES; | |||
| } | |||
| /** | |||
| * Populate data from this array as if it was in local file data. | |||
| * @param data an array of bytes | |||
| * @param offset the start offset | |||
| * @param length the number of bytes in the array from offset | |||
| * | |||
| * @throws ZipException on error | |||
| */ | |||
| public void parseFromLocalFileData(byte[] data, int offset, int length) | |||
| throws ZipException { | |||
| if (length != 0) { | |||
| throw new ZipException("JarMarker doesn't expect any data"); | |||
| } | |||
| } | |||
| } | |||