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 | * Add else attribute to the condition task, which specifies an | ||||
| optional alternate value to set the property to if the nested | optional alternate value to set the property to if the nested | ||||
| condition evaluates to false. Bugzilla report 33074. | 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: | 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"); | * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| * you may not use this file except in compliance with 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.FileSet; | ||||
| import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||
| import org.apache.tools.ant.types.ZipFileSet; | 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; | import org.apache.tools.zip.ZipOutputStream; | ||||
| /** | /** | ||||
| @@ -130,6 +132,15 @@ public class Jar extends Zip { | |||||
| */ | */ | ||||
| private Path indexJars; | 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 */ | /** constructor */ | ||||
| public Jar() { | public Jar() { | ||||
| super(); | super(); | ||||
| @@ -382,7 +393,8 @@ public class Jar extends Zip { | |||||
| Project.MSG_WARN); | 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 | // time to write the manifest | ||||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||||
| OutputStreamWriter osw = new OutputStreamWriter(baos, "UTF-8"); | 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.MergingMapper; | ||||
| import org.apache.tools.ant.util.ResourceUtils; | import org.apache.tools.ant.util.ResourceUtils; | ||||
| import org.apache.tools.zip.ZipEntry; | import org.apache.tools.zip.ZipEntry; | ||||
| import org.apache.tools.zip.ZipExtraField; | |||||
| import org.apache.tools.zip.ZipFile; | import org.apache.tools.zip.ZipFile; | ||||
| import org.apache.tools.zip.ZipOutputStream; | import org.apache.tools.zip.ZipOutputStream; | ||||
| @@ -1030,6 +1031,22 @@ public class Zip extends MatchingTask { | |||||
| protected void zipDir(File dir, ZipOutputStream zOut, String vPath, | protected void zipDir(File dir, ZipOutputStream zOut, String vPath, | ||||
| int mode) | int mode) | ||||
| throws IOException { | 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) { | if (addedDirs.get(vPath) != null) { | ||||
| // don't add directories we've already added. | // don't add directories we've already added. | ||||
| // no warning if we try, it is harmless in and of itself | // 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.setCrc (EMPTY_CRC); | ||||
| ze.setUnixMode(mode); | ze.setUnixMode(mode); | ||||
| zOut.putNextEntry (ze); | |||||
| if (extra != null) { | |||||
| ze.setExtraFields(extra); | |||||
| } | |||||
| zOut.putNextEntry(ze); | |||||
| } | } | ||||
| } | } | ||||
| @@ -37,6 +37,7 @@ public class ExtraFieldUtils { | |||||
| static { | static { | ||||
| implementations = new Hashtable(); | implementations = new Hashtable(); | ||||
| register(AsiExtraField.class); | 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"); | |||||
| } | |||||
| } | |||||
| } | |||||