|
@@ -0,0 +1,235 @@ |
|
|
|
|
|
/* |
|
|
|
|
|
* The Apache Software License, Version 1.1 |
|
|
|
|
|
* |
|
|
|
|
|
* Copyright (c) 2002 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", "Ant", 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 |
|
|
|
|
|
* <http://www.apache.org/>. |
|
|
|
|
|
*/ |
|
|
|
|
|
package org.apache.tools.ant.util; |
|
|
|
|
|
|
|
|
|
|
|
import org.apache.tools.ant.taskdefs.condition.Os; |
|
|
|
|
|
import java.io.File; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* A set of helper methods related to locating executables or checking |
|
|
|
|
|
* conditons of a given Java installation. |
|
|
|
|
|
* |
|
|
|
|
|
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> |
|
|
|
|
|
* |
|
|
|
|
|
* @since Ant 1.5 |
|
|
|
|
|
*/ |
|
|
|
|
|
public class JavaEnvUtils { |
|
|
|
|
|
|
|
|
|
|
|
/** Are we on a DOS-based system */ |
|
|
|
|
|
private static final boolean isDos = Os.isFamily("dos"); |
|
|
|
|
|
/** Are we on Novell NetWare */ |
|
|
|
|
|
private static final boolean isNetware = Os.isName("netware"); |
|
|
|
|
|
/** Are we on AIX */ |
|
|
|
|
|
private static final boolean isAix = Os.isName("aix"); |
|
|
|
|
|
|
|
|
|
|
|
/** shortcut for System.getProperty("java.home") */ |
|
|
|
|
|
private static final String javaHome = System.getProperty("java.home"); |
|
|
|
|
|
|
|
|
|
|
|
/** FileUtils instance for path normalization */ |
|
|
|
|
|
private static final FileUtils fileUtils = FileUtils.newFileUtils(); |
|
|
|
|
|
|
|
|
|
|
|
/** Version of currently running VM. */ |
|
|
|
|
|
private static String javaVersion; |
|
|
|
|
|
|
|
|
|
|
|
/** Version constant for Java 1.0 */ |
|
|
|
|
|
public final static String JAVA_1_0 = "1.0"; |
|
|
|
|
|
/** Version constant for Java 1.1 */ |
|
|
|
|
|
public final static String JAVA_1_1 = "1.1"; |
|
|
|
|
|
/** Version constant for Java 1.2 */ |
|
|
|
|
|
public final static String JAVA_1_2 = "1.2"; |
|
|
|
|
|
/** Version constant for Java 1.3 */ |
|
|
|
|
|
public final static String JAVA_1_3 = "1.3"; |
|
|
|
|
|
/** Version constant for Java 1.4 */ |
|
|
|
|
|
public final static String JAVA_1_4 = "1.4"; |
|
|
|
|
|
|
|
|
|
|
|
static { |
|
|
|
|
|
|
|
|
|
|
|
// Determine the Java version by looking at available classes |
|
|
|
|
|
// java.lang.CharSequence was introduced in JDK 1.4 |
|
|
|
|
|
// java.lang.StrictMath was introduced in JDK 1.3 |
|
|
|
|
|
// java.lang.ThreadLocal was introduced in JDK 1.2 |
|
|
|
|
|
// java.lang.Void was introduced in JDK 1.1 |
|
|
|
|
|
// Count up version until a NoClassDefFoundError ends the try |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
javaVersion = JAVA_1_0; |
|
|
|
|
|
Class.forName("java.lang.Void"); |
|
|
|
|
|
javaVersion = JAVA_1_1; |
|
|
|
|
|
Class.forName("java.lang.ThreadLocal"); |
|
|
|
|
|
javaVersion = JAVA_1_2; |
|
|
|
|
|
Class.forName("java.lang.StrictMath"); |
|
|
|
|
|
javaVersion = JAVA_1_3; |
|
|
|
|
|
Class.forName("java.lang.CharSequence"); |
|
|
|
|
|
javaVersion = JAVA_1_4; |
|
|
|
|
|
} catch (ClassNotFoundException cnfe) { |
|
|
|
|
|
// swallow as we've hit the max class version that |
|
|
|
|
|
// we have |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Returns the version of Java this class is running under. |
|
|
|
|
|
* @return the version of Java as a String, e.g. "1.1" |
|
|
|
|
|
*/ |
|
|
|
|
|
public static String getJavaVersion() { |
|
|
|
|
|
return javaVersion; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Finds an executable that is part of a JRE installation based on |
|
|
|
|
|
* the java.home system property. |
|
|
|
|
|
* |
|
|
|
|
|
* <p><code>java</code>, <code>keytool</code>, |
|
|
|
|
|
* <code>policytool</code>, <code>orbd</code>, <code>rmid</code>, |
|
|
|
|
|
* <code>rmiregistry</code>, <code>servertool</code> and |
|
|
|
|
|
* <code>tnameserv</code> are JRE executables on Sun based |
|
|
|
|
|
* JRE's.</p> |
|
|
|
|
|
* |
|
|
|
|
|
* <p>You typically find them in <code>JAVA_HOME/jre/bin</code> if |
|
|
|
|
|
* <code>JAVA_HOME</code> points to your JDK installation. JDK |
|
|
|
|
|
* < 1.2 has them in the same directory as the JDK |
|
|
|
|
|
* executables.</p> |
|
|
|
|
|
* |
|
|
|
|
|
* @since Ant 1.5 |
|
|
|
|
|
*/ |
|
|
|
|
|
public static String getJreExecutable(String command) { |
|
|
|
|
|
if (isNetware) { |
|
|
|
|
|
// Extrapolating from: |
|
|
|
|
|
// "NetWare may have a "java" in that directory, but 99% of |
|
|
|
|
|
// the time, you don't want to execute it" -- Jeff Tulley |
|
|
|
|
|
// <JTULLEY@novell.com> |
|
|
|
|
|
return command; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
File jExecutable = findInDir(javaHome + "/bin", command); |
|
|
|
|
|
|
|
|
|
|
|
if (jExecutable == null && isAix) { |
|
|
|
|
|
// On IBM's JDK 1.2 the directory layout is different, 1.3 follows |
|
|
|
|
|
// Sun's layout. |
|
|
|
|
|
jExecutable = findInDir(javaHome + "/sh", command); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (jExecutable != null) { |
|
|
|
|
|
return jExecutable.getAbsolutePath(); |
|
|
|
|
|
} else { |
|
|
|
|
|
// Unfortunately on Windows java.home doesn't always refer |
|
|
|
|
|
// to the correct location, so we need to fall back to |
|
|
|
|
|
// assuming java is somewhere on the PATH. |
|
|
|
|
|
return addExtension(command); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Finds an executable that is part of a JDK installation based on |
|
|
|
|
|
* the java.home system property. |
|
|
|
|
|
* |
|
|
|
|
|
* <p>You typically find them in <code>JAVA_HOME/bin</code> if |
|
|
|
|
|
* <code>JAVA_HOME</code> points to your JDK installation.</p> |
|
|
|
|
|
* |
|
|
|
|
|
* @since Ant 1.5 |
|
|
|
|
|
*/ |
|
|
|
|
|
public static String getJdkExecutable(String command) { |
|
|
|
|
|
if (isNetware) { |
|
|
|
|
|
// Extrapolating from: |
|
|
|
|
|
// "NetWare may have a "java" in that directory, but 99% of |
|
|
|
|
|
// the time, you don't want to execute it" -- Jeff Tulley |
|
|
|
|
|
// <JTULLEY@novell.com> |
|
|
|
|
|
return command; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
File jExecutable = findInDir(javaHome + "/../bin", command); |
|
|
|
|
|
|
|
|
|
|
|
if (jExecutable == null && isAix) { |
|
|
|
|
|
// On IBM's JDK 1.2 the directory layout is different, 1.3 follows |
|
|
|
|
|
// Sun's layout. |
|
|
|
|
|
jExecutable = findInDir(javaHome + "/../sh", command); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (jExecutable != null) { |
|
|
|
|
|
return jExecutable.getAbsolutePath(); |
|
|
|
|
|
} else { |
|
|
|
|
|
// fall back to JRE bin directory, also catches JDK 1.0 and 1.1 |
|
|
|
|
|
// where java.home points to the root of the JDK |
|
|
|
|
|
return getJreExecutable(command); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Adds a system specific extension to the name of an executable. |
|
|
|
|
|
* |
|
|
|
|
|
* @since Ant 1.5 |
|
|
|
|
|
*/ |
|
|
|
|
|
private static String addExtension(String command) { |
|
|
|
|
|
// This is the most common extension case - exe for windows and OS/2, |
|
|
|
|
|
// nothing for *nix. |
|
|
|
|
|
return command + (isDos ? ".exe" : ""); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Look for an executable in a given directory. |
|
|
|
|
|
* |
|
|
|
|
|
* @return null if the executable cannot be found. |
|
|
|
|
|
*/ |
|
|
|
|
|
private static File findInDir(String dirName, String commandName) { |
|
|
|
|
|
File dir = fileUtils.normalize(dirName); |
|
|
|
|
|
File executable = null; |
|
|
|
|
|
if (dir.exists()) { |
|
|
|
|
|
executable = new File(dir, addExtension(commandName)); |
|
|
|
|
|
if (!executable.exists()) { |
|
|
|
|
|
executable = null; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return executable; |
|
|
|
|
|
} |
|
|
|
|
|
} |