Current directory (lodaer.path=.) pathology workaround
It turns out that loader.path=. was pathological and before this change ended up making the classpath empty (loader.path=.,lib/ would have fixed it). With this change the old behaviour is still supported, but if the only user-supplied path entry is "." (or empty) then it is now kept, and translates into the root of the current archive if running as "java -jar ...". Fixes gh-270
This commit is contained in:
parent
083cb388c0
commit
f0f73a4ead
|
|
@ -64,7 +64,7 @@ public class JarCommandIT {
|
||||||
Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(),
|
Invocation invocation = this.cli.invoke("jar", jar.getAbsolutePath(),
|
||||||
"jar.groovy");
|
"jar.groovy");
|
||||||
invocation.await();
|
invocation.await();
|
||||||
assertEquals(0, invocation.getErrorOutput().length());
|
assertEquals(invocation.getErrorOutput(), 0, invocation.getErrorOutput().length());
|
||||||
assertTrue(jar.exists());
|
assertTrue(jar.exists());
|
||||||
|
|
||||||
Process process = new JavaExecutable().processBuilder("-jar",
|
Process process = new JavaExecutable().processBuilder("-jar",
|
||||||
|
|
|
||||||
|
|
@ -310,12 +310,18 @@ public class PropertiesLauncher extends Launcher {
|
||||||
List<String> paths = new ArrayList<String>();
|
List<String> paths = new ArrayList<String>();
|
||||||
for (String path : commaSeparatedPaths.split(",")) {
|
for (String path : commaSeparatedPaths.split(",")) {
|
||||||
path = cleanupPath(path);
|
path = cleanupPath(path);
|
||||||
// Empty path is always on the classpath so no need for it to be explicitly
|
// Empty path (i.e. the archive itself if running from a JAR) is always added
|
||||||
// listed here
|
// to the classpath so no need for it to be explicitly listed
|
||||||
if (!(path.equals(".") || path.equals(""))) {
|
if (!(path.equals(".") || path.equals(""))) {
|
||||||
paths.add(path);
|
paths.add(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (paths.isEmpty()) {
|
||||||
|
// On the other hand, we don't want a completely empty path. If the app is
|
||||||
|
// running from an archive (java -jar) then this will make sure the archive
|
||||||
|
// itself is included at the very least.
|
||||||
|
paths.add(".");
|
||||||
|
}
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -453,12 +459,12 @@ public class PropertiesLauncher extends Launcher {
|
||||||
}
|
}
|
||||||
if (file.isDirectory()) {
|
if (file.isDirectory()) {
|
||||||
this.logger.info("Adding classpath entries from " + file);
|
this.logger.info("Adding classpath entries from " + file);
|
||||||
Archive archive = new ExplodedArchive(file);
|
Archive archive = new ExplodedArchive(file, false);
|
||||||
lib.add(archive);
|
lib.add(archive);
|
||||||
}
|
}
|
||||||
Archive archive = getArchive(file);
|
Archive archive = getArchive(file);
|
||||||
if (archive != null) {
|
if (archive != null) {
|
||||||
this.logger.info("Adding classpath entries from nested " + archive.getUrl()
|
this.logger.info("Adding classpath entries from archive " + archive.getUrl()
|
||||||
+ root);
|
+ root);
|
||||||
lib.add(archive);
|
lib.add(archive);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,9 @@ public class ExplodedArchive extends Archive {
|
||||||
this.entries.put(entry.getName(), entry);
|
this.entries.put(entry.getName(), entry);
|
||||||
}
|
}
|
||||||
if (file.isDirectory()) {
|
if (file.isDirectory()) {
|
||||||
if (this.recursive) {
|
|
||||||
for (File child : file.listFiles()) {
|
for (File child : file.listFiles()) {
|
||||||
if (!SKIPPED_NAMES.contains(child.getName())) {
|
if (!SKIPPED_NAMES.contains(child.getName())) {
|
||||||
|
if (file.equals(this.root) || this.recursive) {
|
||||||
buildEntries(child);
|
buildEntries(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,14 @@ public class PropertiesLauncherTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUserSpecifiedPath() throws Exception {
|
public void testUserSpecifiedDotPath() throws Exception {
|
||||||
|
System.setProperty("loader.path", ".");
|
||||||
|
PropertiesLauncher launcher = new PropertiesLauncher();
|
||||||
|
assertEquals("[.]", ReflectionTestUtils.getField(launcher, "paths").toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUserSpecifiedWildcardPath() throws Exception {
|
||||||
System.setProperty("loader.path", "jars/*");
|
System.setProperty("loader.path", "jars/*");
|
||||||
System.setProperty("loader.main", "demo.Application");
|
System.setProperty("loader.main", "demo.Application");
|
||||||
PropertiesLauncher launcher = new PropertiesLauncher();
|
PropertiesLauncher launcher = new PropertiesLauncher();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue