From 689eb3e14833399673e245f72abe31a032f91851 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 30 Apr 2014 15:19:24 +0100 Subject: [PATCH] Add URLs from parent classloader in executable jar $ (cd spring-boot-tools; mvn clean install -DskipTests=true) $ (cd spring-boot-samples/spring-boot-sample-simple/; mvn clean package) $ java -jar spring-boot-samples/spring-boot-sample-simple/target/spring-boot-sample-simple-1.1.0.BUILD-SNAPSHOT.jar (vanilla executable jar archive: works) $ java -cp spring-boot-samples/spring-boot-sample-simple/target/spring-boot-sample-simple-1.1.0.BUILD-SNAPSHOT.jar:spring-boot-tools/spring-boot-loader/src/test/resources/jars/app.jar org.springframework.boot.loader.JarLauncher (jar archive plus vanilla plugin: works) $ (cd spring-boot-samples/spring-boot-sample-simple/target; rm -rf app && mkdir $_ && cd $_ && jar -xf ../*.jar) $ java -cp spring-boot-samples/spring-boot-sample-simple/target/app/ org.springframework.boot.loader.JarLauncher (exploded directory: works) $ java -cp spring-boot-tools/spring-boot-loader/s:spring-boot-tools/spring-boot-loader/src/test/resources/jars/app.jar org.springframework.boot.loader.JarLauncher (exploded directory with plugin jar: works) Potential fix for gh-529 --- .../src/it/executable-jar/pom.xml | 2 +- .../src/it/executable-war/pom.xml | 2 +- .../loader/ExecutableArchiveLauncher.java | 35 ++++++++++++++++++ .../src/test/resources/jars/app.jar | Bin 1146 -> 2213 bytes 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml b/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml index 2fffa60044..b32c0e5d4c 100644 --- a/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml +++ b/spring-boot-tools/spring-boot-loader/src/it/executable-jar/pom.xml @@ -63,7 +63,7 @@ - org.springframework.boot.load.JarLauncher + org.springframework.boot.loader.JarLauncher org.springframework.boot.load.it.jar.EmbeddedJarStarter diff --git a/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml b/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml index 193173d667..efa6e7b048 100644 --- a/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml +++ b/spring-boot-tools/spring-boot-loader/src/it/executable-war/pom.xml @@ -27,7 +27,7 @@ - org.springframework.boot.load.WarLauncher + org.springframework.boot.loader.WarLauncher org.springframework.boot.load.it.war.embedded.EmbeddedWarStarter diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/ExecutableArchiveLauncher.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/ExecutableArchiveLauncher.java index c50a13e6f5..ed93d835e0 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/ExecutableArchiveLauncher.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/ExecutableArchiveLauncher.java @@ -16,8 +16,12 @@ package org.springframework.boot.loader; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import java.util.jar.JarEntry; import org.springframework.boot.loader.archive.Archive; @@ -64,6 +68,21 @@ public abstract class ExecutableArchiveLauncher extends Launcher { return archives; } + @Override + protected ClassLoader createClassLoader(URL[] urls) throws Exception { + Set copy = new LinkedHashSet(); + ClassLoader loader = getDefaultClassLoader(); + if (loader instanceof URLClassLoader) { + for (URL url : ((URLClassLoader) loader).getURLs()) { + copy.add(url); + } + } + for (URL url : urls) { + copy.add(url); + } + return super.createClassLoader(copy.toArray(new URL[copy.size()])); + } + /** * Determine if the specified {@link JarEntry} is a nested item that should be added * to the classpath. The method is called once for each entry. @@ -81,4 +100,20 @@ public abstract class ExecutableArchiveLauncher extends Launcher { protected void postProcessClassPathArchives(List archives) throws Exception { } + private static ClassLoader getDefaultClassLoader() { + ClassLoader cl = null; + try { + cl = Thread.currentThread().getContextClassLoader(); + } + catch (Throwable ex) { + // Cannot access thread context ClassLoader - falling back to system class + // loader... + } + if (cl == null) { + // No thread context class loader -> use class loader of this class. + cl = ExecutableArchiveLauncher.class.getClassLoader(); + } + return cl; + } + } diff --git a/spring-boot-tools/spring-boot-loader/src/test/resources/jars/app.jar b/spring-boot-tools/spring-boot-loader/src/test/resources/jars/app.jar index c7c485ae5dac49a6b115c4d9f747e960caf34286..fb02c027012d66154056f7e7df17ba836ee6d2b8 100644 GIT binary patch delta 1309 zcmeyxu~d*Rz?+#xgn@&DgF&Nwp36i&Gj! z>NJL_*`JC&7BMmec(ZeeNkzCiGcYi?05QlcE(Qh;1_ni-SwI0eU;(lc3kviRwxO%w zfvRxJ&)3UJEK96CcaW>T*?@=b!RFeo2cG)1jQWQXmLE*8bG+))Wu}=~dg8;~@S773 zCRnmg(y!n1(#=>w;=Ok2-1N=^MlT*5y;LCn_`^Y?SJNzC30tSH*dKA|wol8a=`9^i zGU5H!Uwk|^27SG#ZNGi;+Xb_II119*N^+d0yD`=+da!cSuU!i|-Ug=1@2=nQ)-g?M z){geqY=eoro3q;#Ko@)GmYr(X%ozBQ$a5fm0XUd{_z2lR&| zBP1*!;i`-l7Q9G4P0mRyF3t_K^*?MNVzd0h62&Q(E`5qzz#NpA!FEikUZv&AN+uUU z?#ax{iZb7vD0Jxgqaxvu^nm@tVgY?tPQ}uX-uHHwm)q6X?X73H;eOg(@TyQ&#HWDo z7Y}Ue78PHucTJ*;J;<~AL_o&-IHNN%ucZ%exG>#oPD-K58P@(|S2Sn%7@FJ)|0}rv z`NJ8j6D>Bltx7b%|C!y&`1&IC;x+ZxFYlUsSR(AaacZiLUaD5-a}Ukjol~Qh@>JL6 zwk6JbqO!g1_#?;JyA8G;;>eX37L@0Sq@!T@K3nm zO8rAg!^l$(A9kD$n0-mjdFLG2;F7Q3wmi9TNXM3+@#R{XRVDsbwZF21QbW?e-#akx zWpiTRxkvuO{u~DXx$iCvZO?ki>bLbn*G&5z_L3FCaqLe!Pcdojcj-Q04vMZfN-I_s z0;5WU2|4LrshI~#&mb`IwkRXV#*a;mj2x3on0D90a?0LZ)YL5rRO{;+;;8HC=cZp= zP?VXMu9udWT#{dunOb~W-|M=zp2n#&-u~KNXMAz}&jed@gaMQ8kDI#fjGdMkx7IB zk#8s4GMflMGcG(wPHtp2s>hKTfo4F#As`LOng}C7nG-oNgEA)qJOMI6I$&89*)gER zjvTI2m>C#SQgicxWd+PZlb>T-)lUUsu7#KhpWF8lgp4`B!#K^FDF>@0mBg14h*4=!J zOd<>jn