@@ -142,48 +142,64 @@ public PropertiesLauncher() {
142142 }
143143
144144 protected File getHomeDirectory () {
145- return new File (SystemPropertyUtils
146- .resolvePlaceholders (System .getProperty (HOME , "${user.dir}" )));
145+ try {
146+ return new File (getPropertyWithDefault (HOME , "${user.dir}" ));
147+ }
148+ catch (Exception ex ) {
149+ throw new IllegalStateException (ex );
150+ }
147151 }
148152
149153 private void initializeProperties () throws Exception , IOException {
150- String config = "classpath:BOOT-INF/classes/"
151- + SystemPropertyUtils .resolvePlaceholders (
152- SystemPropertyUtils .getProperty (CONFIG_NAME , "application" ))
153- + ".properties" ;
154- config = SystemPropertyUtils .resolvePlaceholders (
155- SystemPropertyUtils .getProperty (CONFIG_LOCATION , config ));
156- InputStream resource = getResource (config );
157- if (resource != null ) {
158- log ("Found: " + config );
159- try {
160- this .properties .load (resource );
161- }
162- finally {
163- resource .close ();
154+ List <String > configs = new ArrayList <String >();
155+ if (getProperty (CONFIG_LOCATION ) != null ) {
156+ configs .add (getProperty (CONFIG_LOCATION ));
157+ }
158+ else {
159+ String [] names = getPropertyWithDefault (CONFIG_NAME , "loader,application" )
160+ .split ("," );
161+ for (String name : names ) {
162+ configs .add ("file:" + getHomeDirectory () + "/" + name + ".properties" );
163+ configs .add ("classpath:" + name + ".properties" );
164+ configs .add ("classpath:BOOT-INF/classes/" + name + ".properties" );
164165 }
165- for (Object key : Collections .list (this .properties .propertyNames ())) {
166- String text = this .properties .getProperty ((String ) key );
167- String value = SystemPropertyUtils .resolvePlaceholders (this .properties ,
168- text );
169- if (value != null ) {
170- this .properties .put (key , value );
166+ }
167+ for (String config : configs ) {
168+ InputStream resource = getResource (config );
169+ if (resource != null ) {
170+ debug ("Found: " + config );
171+ try {
172+ this .properties .load (resource );
173+ }
174+ finally {
175+ resource .close ();
171176 }
172- }
173- if (SystemPropertyUtils
174- .resolvePlaceholders ("${" + SET_SYSTEM_PROPERTIES + ":false}" )
175- .equals ("true" )) {
176- log ("Adding resolved properties to System properties" );
177177 for (Object key : Collections .list (this .properties .propertyNames ())) {
178- String value = this .properties .getProperty ((String ) key );
179- System .setProperty ((String ) key , value );
178+ if (config .endsWith ("application.properties" )
179+ && ((String ) key ).startsWith ("loader." )) {
180+ warn ("Use of application.properties for PropertiesLauncher is deprecated" );
181+ }
182+ String text = this .properties .getProperty ((String ) key );
183+ String value = SystemPropertyUtils
184+ .resolvePlaceholders (this .properties , text );
185+ if (value != null ) {
186+ this .properties .put (key , value );
187+ }
188+ }
189+ if ("true" .equals (getProperty (SET_SYSTEM_PROPERTIES ))) {
190+ debug ("Adding resolved properties to System properties" );
191+ for (Object key : Collections .list (this .properties .propertyNames ())) {
192+ String value = this .properties .getProperty ((String ) key );
193+ System .setProperty ((String ) key , value );
194+ }
180195 }
196+ // Load the first one we find
197+ return ;
198+ }
199+ else {
200+ debug ("Not found: " + config );
181201 }
182202 }
183- else {
184- log ("Not found: " + config );
185- }
186-
187203 }
188204
189205 private InputStream getResource (String config ) throws Exception {
@@ -216,13 +232,13 @@ private InputStream getClasspathResource(String config) {
216232 config = config .substring (1 );
217233 }
218234 config = "/" + config ;
219- log ("Trying classpath: " + config );
235+ debug ("Trying classpath: " + config );
220236 return getClass ().getResourceAsStream (config );
221237 }
222238
223239 private InputStream getFileResource (String config ) throws Exception {
224240 File file = new File (config );
225- log ("Trying file: " + config );
241+ debug ("Trying file: " + config );
226242 if (file .canRead ()) {
227243 return new FileInputStream (file );
228244 }
@@ -278,7 +294,7 @@ private void initializePaths() throws Exception {
278294 if (path != null ) {
279295 this .paths = parsePathsProperty (path );
280296 }
281- log ("Nested archive paths: " + this .paths );
297+ debug ("Nested archive paths: " + this .paths );
282298 }
283299
284300 private List <String > parsePathsProperty (String commaSeparatedPaths ) {
@@ -326,7 +342,7 @@ protected ClassLoader createClassLoader(List<Archive> archives) throws Exception
326342 String customLoaderClassName = getProperty ("loader.classLoader" );
327343 if (customLoaderClassName != null ) {
328344 loader = wrapWithCustomClassLoader (loader , customLoaderClassName );
329- log ("Using custom class loader: " + customLoaderClassName );
345+ debug ("Using custom class loader: " + customLoaderClassName );
330346 }
331347 return loader ;
332348 }
@@ -354,34 +370,50 @@ private ClassLoader wrapWithCustomClassLoader(ClassLoader parent,
354370 }
355371
356372 private String getProperty (String propertyKey ) throws Exception {
357- return getProperty (propertyKey , null );
373+ return getProperty (propertyKey , null , null );
358374 }
359375
360376 private String getProperty (String propertyKey , String manifestKey ) throws Exception {
377+ return getProperty (propertyKey , manifestKey , null );
378+ }
379+
380+ private String getPropertyWithDefault (String propertyKey , String defaultValue )
381+ throws Exception {
382+ return getProperty (propertyKey , null , defaultValue );
383+ }
384+
385+ private String getProperty (String propertyKey , String manifestKey ,
386+ String defaultValue ) throws Exception {
361387 if (manifestKey == null ) {
362388 manifestKey = propertyKey .replace ('.' , '-' );
363389 manifestKey = toCamelCase (manifestKey );
364390 }
365391 String property = SystemPropertyUtils .getProperty (propertyKey );
366392 if (property != null ) {
367- String value = SystemPropertyUtils .resolvePlaceholders (property );
368- log ("Property '" + propertyKey + "' from environment: " + value );
393+ String value = SystemPropertyUtils .resolvePlaceholders (this .properties ,
394+ property );
395+ debug ("Property '" + propertyKey + "' from environment: " + value );
369396 return value ;
370397 }
371398 if (this .properties .containsKey (propertyKey )) {
372- String value = SystemPropertyUtils
373- . resolvePlaceholders ( this .properties .getProperty (propertyKey ));
374- log ("Property '" + propertyKey + "' from properties: " + value );
399+ String value = SystemPropertyUtils . resolvePlaceholders ( this . properties ,
400+ this .properties .getProperty (propertyKey ));
401+ debug ("Property '" + propertyKey + "' from properties: " + value );
375402 return value ;
376403 }
377404 try {
378- // Prefer home dir for MANIFEST if there is one
379- Manifest manifest = new ExplodedArchive (this .home , false ).getManifest ();
380- if (manifest != null ) {
381- String value = manifest .getMainAttributes ().getValue (manifestKey );
382- log ("Property '" + manifestKey + "' from home directory manifest: "
383- + value );
384- return value ;
405+ if (this .home != null ) {
406+ // Prefer home dir for MANIFEST if there is one
407+ Manifest manifest = new ExplodedArchive (this .home , false ).getManifest ();
408+ if (manifest != null ) {
409+ String value = manifest .getMainAttributes ().getValue (manifestKey );
410+ if (value != null ) {
411+ debug ("Property '" + manifestKey
412+ + "' from home directory manifest: " + value );
413+ return SystemPropertyUtils .resolvePlaceholders (this .properties ,
414+ value );
415+ }
416+ }
385417 }
386418 }
387419 catch (IllegalStateException ex ) {
@@ -392,11 +424,12 @@ private String getProperty(String propertyKey, String manifestKey) throws Except
392424 if (manifest != null ) {
393425 String value = manifest .getMainAttributes ().getValue (manifestKey );
394426 if (value != null ) {
395- log ("Property '" + manifestKey + "' from archive manifest: " + value );
396- return value ;
427+ debug ("Property '" + manifestKey + "' from archive manifest: " + value );
428+ return SystemPropertyUtils . resolvePlaceholders ( this . properties , value ) ;
397429 }
398430 }
399- return null ;
431+ return defaultValue == null ? defaultValue
432+ : SystemPropertyUtils .resolvePlaceholders (this .properties , defaultValue );
400433 }
401434
402435 @ Override
@@ -427,18 +460,18 @@ private List<Archive> getClassPathArchives(String path) throws Exception {
427460 file = new File (this .home , root );
428461 }
429462 if (file .isDirectory ()) {
430- log ("Adding classpath entries from " + file );
463+ debug ("Adding classpath entries from " + file );
431464 Archive archive = new ExplodedArchive (file , false );
432465 lib .add (archive );
433466 }
434467 Archive archive = getArchive (file );
435468 if (archive != null ) {
436- log ("Adding classpath entries from archive " + archive .getUrl () + root );
469+ debug ("Adding classpath entries from archive " + archive .getUrl () + root );
437470 lib .add (archive );
438471 }
439472 Archive nested = getNestedArchive (root );
440473 if (nested != null ) {
441- log ("Adding classpath entries from nested " + nested . getUrl () + root );
474+ debug ("Adding classpath entries from nested " + root );
442475 lib .add (nested );
443476 }
444477 return lib ;
@@ -540,14 +573,21 @@ private static String capitalize(String str) {
540573 return Character .toUpperCase (str .charAt (0 )) + str .substring (1 );
541574 }
542575
543- private void log (String message ) {
576+ private void debug (String message ) {
544577 if (Boolean .getBoolean (DEBUG )) {
545- // We shouldn't use java.util.logging because of classpath issues so we
546- // just sysout log messages when "loader.debug" is true
547- System .out .println (message );
578+ log (message );
548579 }
549580 }
550581
582+ private void warn (String message ) {
583+ log ("WARNING: " + message );
584+ }
585+
586+ private void log (String message ) {
587+ // We shouldn't use java.util.logging because of classpath issues
588+ System .out .println (message );
589+ }
590+
551591 /**
552592 * Convenience class for finding nested archives that have a prefix in their file path
553593 * (e.g. "lib/").
0 commit comments