Commit 4e1245d9 authored by Dave Syer's avatar Dave Syer

Restore changes from 03325019 (fix class loader test failure)

parent e00db0de
...@@ -233,11 +233,14 @@ ...@@ -233,11 +233,14 @@
<archive> <archive>
<manifest> <manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<mainClass>org.springframework.boot.loader.JarLauncher</mainClass> <mainClass>org.springframework.boot.loader.PropertiesLauncher</mainClass>
</manifest> </manifest>
<manifestEntries> <manifestEntries>
<Start-Class>${start-class}</Start-Class> <Start-Class>${start-class}</Start-Class>
</manifestEntries> </manifestEntries>
<manifestEntries>
<Class-Loader>groovy.lang.GroovyClassLoader</Class-Loader>
</manifestEntries>
</archive> </archive>
</configuration> </configuration>
</execution> </execution>
......
...@@ -33,7 +33,11 @@ import java.util.Arrays; ...@@ -33,7 +33,11 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.boot.loader.archive.Archive; import org.springframework.boot.loader.archive.Archive;
import org.springframework.boot.loader.archive.Archive.Entry; import org.springframework.boot.loader.archive.Archive.Entry;
...@@ -116,6 +120,8 @@ public class PropertiesLauncher extends Launcher { ...@@ -116,6 +120,8 @@ public class PropertiesLauncher extends Launcher {
private static final List<String> DEFAULT_PATHS = Arrays.asList("lib/"); private static final List<String> DEFAULT_PATHS = Arrays.asList("lib/");
private static final Pattern WORD_SEPARATOR = Pattern.compile("\\W+");
private final File home; private final File home;
private List<String> paths = new ArrayList<String>(DEFAULT_PATHS); private List<String> paths = new ArrayList<String>(DEFAULT_PATHS);
...@@ -123,6 +129,9 @@ public class PropertiesLauncher extends Launcher { ...@@ -123,6 +129,9 @@ public class PropertiesLauncher extends Launcher {
private Properties properties = new Properties(); private Properties properties = new Properties();
public PropertiesLauncher() { public PropertiesLauncher() {
if (!isDebug()) {
this.logger.setLevel(Level.SEVERE);
}
try { try {
this.home = getHomeDirectory(); this.home = getHomeDirectory();
initializeProperties(this.home); initializeProperties(this.home);
...@@ -133,6 +142,22 @@ public class PropertiesLauncher extends Launcher { ...@@ -133,6 +142,22 @@ public class PropertiesLauncher extends Launcher {
} }
} }
private boolean isDebug() {
String debug = System.getProperty("debug");
if (debug != null && !"false".equals(debug)) {
return true;
}
debug = System.getProperty("DEBUG");
if (debug != null && !"false".equals(debug)) {
return true;
}
debug = System.getenv("DEBUG");
if (debug != null && !"false".equals(debug)) {
return true;
}
return false;
}
protected File getHomeDirectory() { protected File getHomeDirectory() {
return new File(SystemPropertyUtils.resolvePlaceholders(System.getProperty(HOME, return new File(SystemPropertyUtils.resolvePlaceholders(System.getProperty(HOME,
"${user.dir}"))); "${user.dir}")));
...@@ -290,30 +315,82 @@ public class PropertiesLauncher extends Launcher { ...@@ -290,30 +315,82 @@ public class PropertiesLauncher extends Launcher {
@Override @Override
protected String getMainClass() throws Exception { protected String getMainClass() throws Exception {
String property = SystemPropertyUtils.getProperty(MAIN); String mainClass = getProperty(MAIN, "Start-Class");
if (property != null) { if (mainClass == null) {
String mainClass = SystemPropertyUtils.resolvePlaceholders(property); throw new IllegalStateException("No '" + MAIN
this.logger.info("Main class from environment: " + mainClass); + "' or 'Start-Class' specified");
return mainClass;
} }
if (this.properties.containsKey(MAIN)) {
String mainClass = SystemPropertyUtils.resolvePlaceholders(this.properties
.getProperty(MAIN));
this.logger.info("Main class from properties: " + mainClass);
return mainClass; return mainClass;
} }
@Override
protected ClassLoader createClassLoader(List<Archive> archives) throws Exception {
ClassLoader loader = super.createClassLoader(archives);
String classLoaderType = getProperty("loader.classLoader");
if (classLoaderType != null) {
Class<?> type = Class.forName(classLoaderType, true, loader);
try {
loader = (ClassLoader) type.getConstructor(ClassLoader.class)
.newInstance(loader);
}
catch (NoSuchMethodException e) {
try {
loader = (ClassLoader) type.getConstructor(URL[].class,
ClassLoader.class).newInstance(new URL[0], loader);
}
catch (NoSuchMethodException ex) {
loader = (ClassLoader) type.newInstance();
}
}
this.logger.info("Using custom class loader: " + classLoaderType);
}
return loader;
}
private String getProperty(String propertyKey) throws Exception {
return getProperty(propertyKey, null);
}
private String getProperty(String propertyKey, String manifestKey) throws Exception {
if (manifestKey == null) {
manifestKey = propertyKey.replace(".", "-");
manifestKey = toCamelCase(manifestKey);
}
String property = SystemPropertyUtils.getProperty(propertyKey);
if (property != null) {
String value = SystemPropertyUtils.resolvePlaceholders(property);
this.logger.fine("Property '" + propertyKey + "' from environment: " + value);
return value;
}
if (this.properties.containsKey(propertyKey)) {
String value = SystemPropertyUtils.resolvePlaceholders(this.properties
.getProperty(propertyKey));
this.logger.fine("Property '" + propertyKey + "' from properties: " + value);
return value;
}
try { try {
// Prefer home dir for MANIFEST if there is one // Prefer home dir for MANIFEST if there is one
String mainClass = new ExplodedArchive(this.home).getMainClass(); Manifest manifest = new ExplodedArchive(this.home).getManifest();
this.logger.info("Main class from home directory manifest: " + mainClass); if (manifest != null) {
return mainClass; String value = manifest.getMainAttributes().getValue(manifestKey);
this.logger.fine("Property '" + manifestKey
+ "' from home directory manifest: " + value);
return value;
}
} }
catch (IllegalStateException ex) { catch (IllegalStateException ex) {
}
// Otherwise try the parent archive // Otherwise try the parent archive
String mainClass = createArchive().getMainClass(); Manifest manifest = createArchive().getManifest();
this.logger.info("Main class from archive manifest: " + mainClass); if (manifest != null) {
return mainClass; String value = manifest.getMainAttributes().getValue(manifestKey);
if (value != null) {
this.logger.fine("Property '" + manifestKey + "' from archive manifest: "
+ value);
return value;
}
} }
return null;
} }
@Override @Override
...@@ -448,6 +525,28 @@ public class PropertiesLauncher extends Launcher { ...@@ -448,6 +525,28 @@ public class PropertiesLauncher extends Launcher {
new PropertiesLauncher().launch(args); new PropertiesLauncher().launch(args);
} }
public static String toCamelCase(CharSequence string) {
if (string == null) {
return null;
}
StringBuilder builder = new StringBuilder();
Matcher matcher = WORD_SEPARATOR.matcher(string);
int pos = 0;
while (matcher.find()) {
builder.append(capitalize(string.subSequence(pos, matcher.end()).toString()));
pos = matcher.end();
}
builder.append(capitalize(string.subSequence(pos, string.length()).toString()));
return builder.toString();
}
private static Object capitalize(String str) {
StringBuilder sb = new StringBuilder(str.length());
sb.append(Character.toUpperCase(str.charAt(0)));
sb.append(str.substring(1));
return sb.toString();
}
/** /**
* Convenience class for finding nested archives (archive entries that can be * Convenience class for finding nested archives (archive entries that can be
* classpath entries). * classpath entries).
......
...@@ -24,7 +24,6 @@ import java.util.Collections; ...@@ -24,7 +24,6 @@ import java.util.Collections;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.loader.archive.Archive; import org.springframework.boot.loader.archive.Archive;
...@@ -116,7 +115,6 @@ public class PropertiesLauncherTests { ...@@ -116,7 +115,6 @@ public class PropertiesLauncherTests {
} }
@Test @Test
@Ignore
public void testCustomClassLoaderCreation() throws Exception { public void testCustomClassLoaderCreation() throws Exception {
System.setProperty("loader.classLoader", TestLoader.class.getName()); System.setProperty("loader.classLoader", TestLoader.class.getName());
PropertiesLauncher launcher = new PropertiesLauncher(); PropertiesLauncher launcher = new PropertiesLauncher();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment