From f6745b24f59bcc6796529c9b43bd37a0d4dd2846 Mon Sep 17 00:00:00 2001
From: Stefan Bodewig htdocs/manual/ChangeLog.txt
.
Links entries from sub-builds and libraries.
+ +The jlink task can be used to build jar and zip files, similar to +the jar task. +However, jlink provides options for controlling the way entries from +input files +are added to the output file. Specifically, capabilities for merging +entries from +multiple zip or jar files is available.
+ +If a mergefile is specified directly (eg. at the top level of a +mergefiles +pathelement) and the mergefile ends in ".zip" or +".jar", +entries in the mergefile will be merged into the outfile. A file with +any other extension +will be added to the output file, even if it is specified in the +mergefiles element. +Directories specified in either the mergefiles or addfiles element +are added to the +output file as you would expect: all files in subdirectories are +recursively added to +the output file with appropriate prefixes in the output file +(without merging). +
+ ++In the case where duplicate entries and/or files are found among the +files to be merged or +added, jlink merges or adds the first entry and ignores all subsequent entries. +
+ ++jlink ignores META-INF directories in mergefiles. Users should supply their +own manifest information for the output file. +
+ +It is possible to refine the set of files that are being jlinked. +This can be +done with the includes, includesfile, excludes, +excludesfile, +and defaultexcludes attributes on the addfiles and +mergefiles +nested elements. With the includes or includesfile +attribute you specify the files you want to have included by using patterns. +The exclude or excludesfile attribute is used to specify +the files you want to have excluded. This is also done with patterns. And +finally with the defaultexcludes attribute, you can specify whether you +want to use default exclusions or not. See the section on directory based tasks, on how the +inclusion/exclusion of files works, and how to write patterns. The patterns are +relative to the base directory.
+ + + +Attribute | +Description | +Required | +
outfile | +the path of the output file. | +Yes | +
compress | +whether or not the output should be compressed. +true, + yes, or on result in compressed output. + If omitted, output will be uncompressed (inflated). | +No | +
mergefiles | +files to be merged into the output, if possible. | +At least one of +mergefiles or addfiles | +
addfiles | +files to be added to the output. | +
+<jlink compress="false" outfile="out.jar"/> + <mergefiles> + <pathelement path="${build.dir}/mergefoo.jar"/> + <pathelement path="${build.dir}/mergebar.jar"/> + </mergefiles> + <addfiles> + <pathelement path="${build.dir}/mac.jar"/> + <pathelement path="${build.dir}/pc.zip"/> + </addfiles> +</jlink> ++ +Suppose the file foo.jar contains two entries: bar.class and +barnone/myClass.zip. +Suppose the path for file foo.jar is build/tempbuild/foo.jar. The +following example +will provide the entry tempbuild/foo.jar in the out.jar. +
+<jlink compress="false" outfile="out.jar"/> + <mergefiles> + <pathelement path="build/tempbuild"/> + </mergefiles> +</jlink> ++ +However, the next example would result in two top-level entries in out.jar, +namely bar.class and barnone/myClass.zip +
+<jlink compress="false" outfile="out.jar"/> + <mergefiles> + <pathelement path="build/tempbuild/foo.jar"/> + </mergefiles> +</jlink> ++ + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index 182294e88..a8f381a52 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -60,6 +60,7 @@ ftp=org.apache.tools.ant.taskdefs.optional.FTP javacc=org.apache.tools.ant.taskdefs.optional.javacc.JavaCC jjtree=org.apache.tools.ant.taskdefs.optional.javacc.JJTree starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut +jlink=org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask # deprecated ant tasks (kept for back compatibility) javadoc2=org.apache.tools.ant.taskdefs.Javadoc diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java new file mode 100644 index 000000000..0cc96afea --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java @@ -0,0 +1,161 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + *
Extremely minimal constant pool implementation, mainly to support extracting
+ * strings from a class file.
+ * @author Patrick C. Beard.
+ */
+class ConstantPool extends Object{
+
+ static final
+ byte UTF8 = 1, UNUSED = 2, INTEGER = 3, FLOAT = 4, LONG = 5, DOUBLE = 6,
+ CLASS = 7, STRING = 8, FIELDREF = 9, METHODREF = 10,
+ INTERFACEMETHODREF = 11, NAMEANDTYPE = 12;
+
+ byte[] types;
+
+ Object[] values;
+
+ ConstantPool( DataInput data ) throws IOException {
+ super();
+
+ int count = data .readUnsignedShort();
+ types = new byte [ count ];
+ values = new Object [ count ];
+ // read in all constant pool entries.
+ for ( int i = 1; i < count; i++ ) {
+ byte type = data .readByte();
+ types[i] = type;
+ switch (type)
+ {
+ case UTF8 :
+ values[i] = data .readUTF();
+ break;
+
+ case UNUSED :
+ break;
+
+ case INTEGER :
+ values[i] = new Integer( data .readInt() );
+ break;
+
+ case FLOAT :
+ values[i] = new Float( data .readFloat() );
+ break;
+
+ case LONG :
+ values[i] = new Long( data .readLong() );
+ ++i;
+ break;
+
+ case DOUBLE :
+ values[i] = new Double( data .readDouble() );
+ ++i;
+ break;
+
+ case CLASS :
+ case STRING :
+ values[i] = new Integer( data .readUnsignedShort() );
+ break;
+
+ case FIELDREF :
+ case METHODREF :
+ case INTERFACEMETHODREF :
+ case NAMEANDTYPE :
+ values[i] = new Integer( data .readInt() );
+ break;
+ }
+ }
+ }
+
+
+}
+/**
+ * Provides a quick and dirty way to determine the true name of a class
+ * given just an InputStream. Reads in just enough to perform this
+ * minimal task only.
+ */
+public class ClassNameReader extends Object{
+
+ public static
+ String getClassName( InputStream input ) throws IOException {
+ DataInputStream data = new DataInputStream( input );
+ // verify this is a valid class file.
+ int cookie = data .readInt();
+ if ( cookie != 0xCAFEBABE ) {
+ return null;
+ }
+ int version = data .readInt();
+ // read the constant pool.
+ ConstantPool constants = new ConstantPool( data );
+ Object[] values = constants .values;
+ // read access flags and class index.
+ int accessFlags = data .readUnsignedShort();
+ int classIndex = data .readUnsignedShort();
+ Integer stringIndex = (Integer) values[classIndex];
+ String className = (String) values[stringIndex .intValue()];
+ return className;
+ }
+
+
+}
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java
new file mode 100644
index 000000000..8afeb146a
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java
@@ -0,0 +1,211 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *
It is basically a wrapper for the jlink code written originally + * by Patrick Beard. The + * classes org.apache.tools.ant.taskdefs.optional.jlink.Jlink and + * org.apache.tools.ant.taskdefs.optional.jlink.ClassNameReader + * support this class.
+ * + *For example:
+ *
+ *
+ *
+ * @author Matthew Kuperus Heun */
+public class JlinkTask extends MatchingTask {
+
+ /**
+ * The output file for this run of jlink. Usually a jar or zip file.
+ */
+ public void setOutfile( File outfile ) {
+ this.outfile = outfile;
+ }
+
+ /**
+ * Establishes the object that contains the files to
+ * be merged into the output.
+ */
+ public Path createMergefiles() {
+ if ( this .mergefiles == null ) {
+ this .mergefiles = new Path(getProject());
+ }
+ return this .mergefiles.createPath();
+ }
+
+ /**
+ * Sets the files to be merged into the output.
+ */
+ public void setMergefiles( Path mergefiles ) {
+ if ( this .mergefiles == null ) {
+ this .mergefiles = mergefiles;
+ }
+ else {
+ this .mergefiles .append( mergefiles );
+ }
+ }
+
+ /**
+ * Establishes the object that contains the files to
+ * be added to the output.
+ */
+ public Path createAddfiles() {
+ if ( this .addfiles == null ) {
+ this .addfiles = new Path(getProject());
+ }
+ return this .addfiles .createPath();
+ }
+
+ /**
+ * Sets the files to be added into the output.
+ */
+ public void setAddfiles( Path addfiles ) {
+ if ( this .addfiles == null ) {
+ this .addfiles = addfiles;
+ }
+ else {
+ this .addfiles .append( addfiles );
+ }
+ }
+
+ /**
+ * Defines whether or not the output should be compacted.
+ */
+ public void setCompress( boolean compress ) {
+ this .compress = compress;
+ }
+
+ /**
+ * Does the adding and merging.
+ */
+ public void execute() throws BuildException {
+ //Be sure everything has been set.
+ if ( outfile == null ) {
+ throw new BuildException( "outfile attribute is required! Please set." );
+ }
+ if (!haveAddFiles() && !haveMergeFiles()) {
+ throw new BuildException( "addfiles or mergefiles required! Please set." );
+ }
+ log( "linking: " + outfile.getPath() );
+ log( "compression: " + compress, Project.MSG_VERBOSE );
+ jlink linker = new jlink();
+ linker .setOutfile( outfile.getPath() );
+ linker .setCompression( compress );
+ if (haveMergeFiles()){
+ log( "merge files: " + mergefiles .toString(), Project .MSG_VERBOSE );
+ linker .addMergeFiles( mergefiles .list() );
+ }
+ if (haveAddFiles()){
+ log( "add files: " + addfiles .toString(), Project .MSG_VERBOSE );
+ linker .addAddFiles( addfiles .list() );
+ }
+ try {
+ linker .link();
+ } catch( Exception ex ) {
+ throw new BuildException( ex, location );
+ }
+ }
+
+ private boolean haveAddFiles(){
+ return haveEntries(addfiles);
+ }
+
+ private boolean haveMergeFiles(){
+ return haveEntries(mergefiles);
+ }
+
+ private boolean haveEntries(Path p){
+ if (p == null){
+ return false;
+ }
+ if (p.size() > 0){
+ return true;
+ }
+ return false;
+ }
+
+ private File outfile = null;
+
+ private Path mergefiles = null;
+
+ private Path addfiles = null;
+
+ private boolean compress = false;
+
+ private String ps = System .getProperty( "path.separator" );
+
+}
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java
new file mode 100644
index 000000000..899127b62
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java
@@ -0,0 +1,420 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ *
+ * <jlink compress="false" outfile="out.jar"/>
+ * <mergefiles>
+ * <pathelement path="${build.dir}/mergefoo.jar"/>
+ * <pathelement path="${build.dir}/mergebar.jar"/>
+ * </mergefiles>
+ * <addfiles>
+ * <pathelement path="${build.dir}/mac.jar"/>
+ * <pathelement path="${build.dir}/pc.zip"/>
+ * </addfiles>
+ * </jlink>
+ *
+ *