001    /*--------------------------------------------------------------------------+
002    $Id: JavaUtils.java 26268 2010-02-18 10:44:30Z juergens $
003    |                                                                          |
004    | Copyright 2005-2010 Technische Universitaet Muenchen                     |
005    |                                                                          |
006    | Licensed under the Apache License, Version 2.0 (the "License");          |
007    | you may not use this file except in compliance with the License.         |
008    | You may obtain a copy of the License at                                  |
009    |                                                                          |
010    |    http://www.apache.org/licenses/LICENSE-2.0                            |
011    |                                                                          |
012    | Unless required by applicable law or agreed to in writing, software      |
013    | distributed under the License is distributed on an "AS IS" BASIS,        |
014    | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015    | See the License for the specific language governing permissions and      |
016    | limitations under the License.                                           |
017    +--------------------------------------------------------------------------*/
018    package edu.tum.cs.commons.io;
019    
020    import static java.io.File.separatorChar;
021    
022    import java.io.File;
023    
024    /**
025     * This class provides utilities to access a Java runtime execution environment.
026     * 
027     * @author juergens
028     * @author $Author: juergens $
029     * @version $Rev: 26268 $
030     * @levd.rating GREEN Hash: 27257F331AC5DF44F35CBC78C15A1E96
031     */
032    public class JavaUtils {
033    
034            /** JAVA_HOME environment variable. */
035            private static final String JAVA_HOME = System.getProperty("java.home");
036    
037            /** List of candidate java executable names. */
038            private static final String[] CANDIDATE_JAVA_EXECUTABLES = { "java",
039                            "java.exe", "javaw", "javaw.exe", "j9w", "j9w.exe", "j9", "j9.exe" };
040    
041            /**
042             * The list of locations in which to look for the java executable in
043             * candidate VM install locations, relative to the VM install location.
044             */
045            private static final String[] CANDIDATE_JAVA_LOCATIONS = {
046                            "bin" + separatorChar,
047                            "jre" + separatorChar + "bin" + separatorChar };
048    
049            /**
050             * Starting in the specified VM install location, attempt to find the 'java'
051             * executable file. If found, return the corresponding <code>File</code>
052             * object, otherwise return <code>null</code>.
053             * 
054             * This is copied from
055             * <code>org.eclipse.jdt.internal.launching.StandardVMType</code>.
056             */
057            public static File findJavaExecutable(File vmInstallLocation) {
058                    // Try each candidate in order. The first one found wins. Thus, the
059                    // order of CANDIDATE_JAVA_EXECUTABLES and CANDIDATE_JAVA_LOCATIONS is
060                    // significant.
061                    for (int i = 0; i < CANDIDATE_JAVA_EXECUTABLES.length; i++) {
062                            for (int j = 0; j < CANDIDATE_JAVA_LOCATIONS.length; j++) {
063                                    File javaFile = new File(vmInstallLocation,
064                                                    CANDIDATE_JAVA_LOCATIONS[j]
065                                                                    + CANDIDATE_JAVA_EXECUTABLES[i]);
066                                    if (javaFile.isFile()) {
067                                            return javaFile;
068                                    }
069                            }
070                    }
071                    return null;
072            }
073    
074            /**
075             * Use {@link #findJavaExecutable(File)} to search in the directory
076             * specified by environment variable <code>JAVA_HOME</code> for the Java
077             * executable.
078             */
079            public static File obtainJavaExecutable() {
080                    return findJavaExecutable(new File(JAVA_HOME));
081            }
082    
083            /**
084             * Use {@link #obtainJavaExecutable()} to determine the Java executable via
085             * environment variable <code>JAVA_HOME</code>. If this fails, a command
086             * that expects the Java executable to be on the path is returned.
087             */
088            public static String obtainJavaExecutionCommand() {
089                    File executable = obtainJavaExecutable();
090                    if (executable != null) {
091                            return executable.getAbsolutePath();
092                    }
093                    return CANDIDATE_JAVA_EXECUTABLES[0];
094            }
095    
096    }