Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.slider.core.launch; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.yarn.api.ApplicationConstants; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.slider.common.tools.SliderUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; /** * build a classpath -allows for entries to be injected in front of * YARN classpath as well as behind, adds appropriate separators, * extraction of local classpath, etc. */ public class ClasspathConstructor { public static final String CLASS_PATH_SEPARATOR = ApplicationConstants.CLASS_PATH_SEPARATOR; // public static final String CLASS_PATH_SEPARATOR = File.pathSeparator; private final List<String> pathElements = new ArrayList<String>(); public ClasspathConstructor() { } /** * Get the list of JARs from the YARN settings * @param config configuration */ public List<String> yarnApplicationClasspath(Configuration config) { String[] cp = config.getTrimmedStrings(YarnConfiguration.YARN_APPLICATION_CLASSPATH, YarnConfiguration.DEFAULT_YARN_CROSS_PLATFORM_APPLICATION_CLASSPATH); return cp != null ? Arrays.asList(cp) : new ArrayList<String>(0); } @Override public String toString() { return buildClasspath(); } public String buildClasspath() { return SliderUtils.join(pathElements, CLASS_PATH_SEPARATOR, false); } /** * Get a copy of the path list * @return the JARs */ public List<String> getPathElements() { return Collections.unmodifiableList(pathElements); } /** * Append an entry * @param path path */ public void append(String path) { pathElements.add(path); } /** * Insert a path at the front of the list. This places it ahead of * the standard YARN artifacts * @param path path to the JAR. Absolute or relative -on the target * system */ public void insert(String path) { pathElements.add(0, path); } public void appendAll(Collection<String> paths) { pathElements.addAll(paths); } public void insertAll(Collection<String> paths) { pathElements.addAll(0, paths); } public void addLibDir(String pathToLibDir) { append(buildLibDir(pathToLibDir)); } public void insertLibDir(String pathToLibDir) { insert(buildLibDir(pathToLibDir)); } public void addClassDirectory(String pathToDir) { append(appendDirectoryTerminator(pathToDir)); } public void insertClassDirectory(String pathToDir) { insert(buildLibDir(appendDirectoryTerminator(pathToDir))); } public void addRemoteClasspathEnvVar() { append(ApplicationConstants.Environment.CLASSPATH.$$()); } public void insertRemoteClasspathEnvVar() { append(ApplicationConstants.Environment.CLASSPATH.$$()); } /** * Build a lib dir path * @param pathToLibDir path to the directory; may or may not end with a * trailing space * @return a path to a lib dir that is compatible with the java classpath */ public String buildLibDir(String pathToLibDir) { String dir = appendDirectoryTerminator(pathToLibDir); dir += "*"; return dir; } private String appendDirectoryTerminator(String pathToLibDir) { String dir = pathToLibDir.trim(); if (!dir.endsWith("/")) { dir += "/"; } return dir; } /** * Split a classpath. This uses the local path separator so MUST NOT * be used to work with remote classpaths * @param localpath local path * @return a splite */ public Collection<String> splitClasspath(String localpath) { String separator = System.getProperty("path.separator"); return StringUtils.getStringCollection(localpath, separator); } /** * Get the local JVM classpath split up * @return the list of entries on the JVM classpath env var */ public Collection<String> localJVMClasspath() { return splitClasspath(System.getProperty("java.class.path")); } }