|
|
|
@ -142,48 +142,64 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected File getHomeDirectory() {
|
|
|
|
|
return new File(SystemPropertyUtils
|
|
|
|
|
.resolvePlaceholders(System.getProperty(HOME, "${user.dir}")));
|
|
|
|
|
try {
|
|
|
|
|
return new File(getPropertyWithDefault(HOME, "${user.dir}"));
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex) {
|
|
|
|
|
throw new IllegalStateException(ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initializeProperties() throws Exception, IOException {
|
|
|
|
|
String config = "classpath:BOOT-INF/classes/"
|
|
|
|
|
+ SystemPropertyUtils.resolvePlaceholders(
|
|
|
|
|
SystemPropertyUtils.getProperty(CONFIG_NAME, "application"))
|
|
|
|
|
+ ".properties";
|
|
|
|
|
config = SystemPropertyUtils.resolvePlaceholders(
|
|
|
|
|
SystemPropertyUtils.getProperty(CONFIG_LOCATION, config));
|
|
|
|
|
InputStream resource = getResource(config);
|
|
|
|
|
if (resource != null) {
|
|
|
|
|
log("Found: " + config);
|
|
|
|
|
try {
|
|
|
|
|
this.properties.load(resource);
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
resource.close();
|
|
|
|
|
List<String> configs = new ArrayList<String>();
|
|
|
|
|
if (getProperty(CONFIG_LOCATION) != null) {
|
|
|
|
|
configs.add(getProperty(CONFIG_LOCATION));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
String[] names = getPropertyWithDefault(CONFIG_NAME, "loader,application")
|
|
|
|
|
.split(",");
|
|
|
|
|
for (String name : names) {
|
|
|
|
|
configs.add("file:" + getHomeDirectory() + "/" + name + ".properties");
|
|
|
|
|
configs.add("classpath:" + name + ".properties");
|
|
|
|
|
configs.add("classpath:BOOT-INF/classes/" + name + ".properties");
|
|
|
|
|
}
|
|
|
|
|
for (Object key : Collections.list(this.properties.propertyNames())) {
|
|
|
|
|
String text = this.properties.getProperty((String) key);
|
|
|
|
|
String value = SystemPropertyUtils.resolvePlaceholders(this.properties,
|
|
|
|
|
text);
|
|
|
|
|
if (value != null) {
|
|
|
|
|
this.properties.put(key, value);
|
|
|
|
|
}
|
|
|
|
|
for (String config : configs) {
|
|
|
|
|
InputStream resource = getResource(config);
|
|
|
|
|
if (resource != null) {
|
|
|
|
|
debug("Found: " + config);
|
|
|
|
|
try {
|
|
|
|
|
this.properties.load(resource);
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
resource.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (SystemPropertyUtils
|
|
|
|
|
.resolvePlaceholders("${" + SET_SYSTEM_PROPERTIES + ":false}")
|
|
|
|
|
.equals("true")) {
|
|
|
|
|
log("Adding resolved properties to System properties");
|
|
|
|
|
for (Object key : Collections.list(this.properties.propertyNames())) {
|
|
|
|
|
String value = this.properties.getProperty((String) key);
|
|
|
|
|
System.setProperty((String) key, value);
|
|
|
|
|
if (config.endsWith("application.properties")
|
|
|
|
|
&& ((String) key).startsWith("loader.")) {
|
|
|
|
|
warn("Use of application.properties for PropertiesLauncher is deprecated");
|
|
|
|
|
}
|
|
|
|
|
String text = this.properties.getProperty((String) key);
|
|
|
|
|
String value = SystemPropertyUtils
|
|
|
|
|
.resolvePlaceholders(this.properties, text);
|
|
|
|
|
if (value != null) {
|
|
|
|
|
this.properties.put(key, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ("true".equals(getProperty(SET_SYSTEM_PROPERTIES))) {
|
|
|
|
|
debug("Adding resolved properties to System properties");
|
|
|
|
|
for (Object key : Collections.list(this.properties.propertyNames())) {
|
|
|
|
|
String value = this.properties.getProperty((String) key);
|
|
|
|
|
System.setProperty((String) key, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Load the first one we find
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
debug("Not found: " + config);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
log("Not found: " + config);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private InputStream getResource(String config) throws Exception {
|
|
|
|
@ -216,13 +232,13 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
config = config.substring(1);
|
|
|
|
|
}
|
|
|
|
|
config = "/" + config;
|
|
|
|
|
log("Trying classpath: " + config);
|
|
|
|
|
debug("Trying classpath: " + config);
|
|
|
|
|
return getClass().getResourceAsStream(config);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private InputStream getFileResource(String config) throws Exception {
|
|
|
|
|
File file = new File(config);
|
|
|
|
|
log("Trying file: " + config);
|
|
|
|
|
debug("Trying file: " + config);
|
|
|
|
|
if (file.canRead()) {
|
|
|
|
|
return new FileInputStream(file);
|
|
|
|
|
}
|
|
|
|
@ -278,7 +294,7 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
if (path != null) {
|
|
|
|
|
this.paths = parsePathsProperty(path);
|
|
|
|
|
}
|
|
|
|
|
log("Nested archive paths: " + this.paths);
|
|
|
|
|
debug("Nested archive paths: " + this.paths);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<String> parsePathsProperty(String commaSeparatedPaths) {
|
|
|
|
@ -326,7 +342,7 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
String customLoaderClassName = getProperty("loader.classLoader");
|
|
|
|
|
if (customLoaderClassName != null) {
|
|
|
|
|
loader = wrapWithCustomClassLoader(loader, customLoaderClassName);
|
|
|
|
|
log("Using custom class loader: " + customLoaderClassName);
|
|
|
|
|
debug("Using custom class loader: " + customLoaderClassName);
|
|
|
|
|
}
|
|
|
|
|
return loader;
|
|
|
|
|
}
|
|
|
|
@ -354,34 +370,50 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getProperty(String propertyKey) throws Exception {
|
|
|
|
|
return getProperty(propertyKey, null);
|
|
|
|
|
return getProperty(propertyKey, null, null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getProperty(String propertyKey, String manifestKey) throws Exception {
|
|
|
|
|
return getProperty(propertyKey, manifestKey, null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getPropertyWithDefault(String propertyKey, String defaultValue)
|
|
|
|
|
throws Exception {
|
|
|
|
|
return getProperty(propertyKey, null, defaultValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getProperty(String propertyKey, String manifestKey,
|
|
|
|
|
String defaultValue) throws Exception {
|
|
|
|
|
if (manifestKey == null) {
|
|
|
|
|
manifestKey = propertyKey.replace('.', '-');
|
|
|
|
|
manifestKey = toCamelCase(manifestKey);
|
|
|
|
|
}
|
|
|
|
|
String property = SystemPropertyUtils.getProperty(propertyKey);
|
|
|
|
|
if (property != null) {
|
|
|
|
|
String value = SystemPropertyUtils.resolvePlaceholders(property);
|
|
|
|
|
log("Property '" + propertyKey + "' from environment: " + value);
|
|
|
|
|
String value = SystemPropertyUtils.resolvePlaceholders(this.properties,
|
|
|
|
|
property);
|
|
|
|
|
debug("Property '" + propertyKey + "' from environment: " + value);
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
if (this.properties.containsKey(propertyKey)) {
|
|
|
|
|
String value = SystemPropertyUtils
|
|
|
|
|
.resolvePlaceholders(this.properties.getProperty(propertyKey));
|
|
|
|
|
log("Property '" + propertyKey + "' from properties: " + value);
|
|
|
|
|
String value = SystemPropertyUtils.resolvePlaceholders(this.properties,
|
|
|
|
|
this.properties.getProperty(propertyKey));
|
|
|
|
|
debug("Property '" + propertyKey + "' from properties: " + value);
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
// Prefer home dir for MANIFEST if there is one
|
|
|
|
|
Manifest manifest = new ExplodedArchive(this.home, false).getManifest();
|
|
|
|
|
if (manifest != null) {
|
|
|
|
|
String value = manifest.getMainAttributes().getValue(manifestKey);
|
|
|
|
|
log("Property '" + manifestKey + "' from home directory manifest: "
|
|
|
|
|
+ value);
|
|
|
|
|
return value;
|
|
|
|
|
if (this.home != null) {
|
|
|
|
|
// Prefer home dir for MANIFEST if there is one
|
|
|
|
|
Manifest manifest = new ExplodedArchive(this.home, false).getManifest();
|
|
|
|
|
if (manifest != null) {
|
|
|
|
|
String value = manifest.getMainAttributes().getValue(manifestKey);
|
|
|
|
|
if (value != null) {
|
|
|
|
|
debug("Property '" + manifestKey
|
|
|
|
|
+ "' from home directory manifest: " + value);
|
|
|
|
|
return SystemPropertyUtils.resolvePlaceholders(this.properties,
|
|
|
|
|
value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (IllegalStateException ex) {
|
|
|
|
@ -392,11 +424,12 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
if (manifest != null) {
|
|
|
|
|
String value = manifest.getMainAttributes().getValue(manifestKey);
|
|
|
|
|
if (value != null) {
|
|
|
|
|
log("Property '" + manifestKey + "' from archive manifest: " + value);
|
|
|
|
|
return value;
|
|
|
|
|
debug("Property '" + manifestKey + "' from archive manifest: " + value);
|
|
|
|
|
return SystemPropertyUtils.resolvePlaceholders(this.properties, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
return defaultValue == null ? defaultValue
|
|
|
|
|
: SystemPropertyUtils.resolvePlaceholders(this.properties, defaultValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -427,18 +460,18 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
file = new File(this.home, root);
|
|
|
|
|
}
|
|
|
|
|
if (file.isDirectory()) {
|
|
|
|
|
log("Adding classpath entries from " + file);
|
|
|
|
|
debug("Adding classpath entries from " + file);
|
|
|
|
|
Archive archive = new ExplodedArchive(file, false);
|
|
|
|
|
lib.add(archive);
|
|
|
|
|
}
|
|
|
|
|
Archive archive = getArchive(file);
|
|
|
|
|
if (archive != null) {
|
|
|
|
|
log("Adding classpath entries from archive " + archive.getUrl() + root);
|
|
|
|
|
debug("Adding classpath entries from archive " + archive.getUrl() + root);
|
|
|
|
|
lib.add(archive);
|
|
|
|
|
}
|
|
|
|
|
Archive nested = getNestedArchive(root);
|
|
|
|
|
if (nested != null) {
|
|
|
|
|
log("Adding classpath entries from nested " + nested.getUrl() + root);
|
|
|
|
|
debug("Adding classpath entries from nested " + root);
|
|
|
|
|
lib.add(nested);
|
|
|
|
|
}
|
|
|
|
|
return lib;
|
|
|
|
@ -540,14 +573,21 @@ public class PropertiesLauncher extends Launcher {
|
|
|
|
|
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void log(String message) {
|
|
|
|
|
private void debug(String message) {
|
|
|
|
|
if (Boolean.getBoolean(DEBUG)) {
|
|
|
|
|
// We shouldn't use java.util.logging because of classpath issues so we
|
|
|
|
|
// just sysout log messages when "loader.debug" is true
|
|
|
|
|
System.out.println(message);
|
|
|
|
|
log(message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void warn(String message) {
|
|
|
|
|
log("WARNING: " + message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void log(String message) {
|
|
|
|
|
// We shouldn't use java.util.logging because of classpath issues
|
|
|
|
|
System.out.println(message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convenience class for finding nested archives that have a prefix in their file path
|
|
|
|
|
* (e.g. "lib/").
|
|
|
|
|