Commit 89beef40 authored by Andy Wilkinson's avatar Andy Wilkinson

Merge branch '1.2.x'

parents 24fd5037 681a866c
...@@ -71,6 +71,7 @@ import org.springframework.boot.loader.util.SystemPropertyUtils; ...@@ -71,6 +71,7 @@ import org.springframework.boot.loader.util.SystemPropertyUtils;
* *
* @author Dave Syer * @author Dave Syer
* @author Janne Valkealahti * @author Janne Valkealahti
* @author Andy Wilkinson
*/ */
public class PropertiesLauncher extends Launcher { public class PropertiesLauncher extends Launcher {
...@@ -131,6 +132,8 @@ public class PropertiesLauncher extends Launcher { ...@@ -131,6 +132,8 @@ public class PropertiesLauncher extends Launcher {
private final File home; private final File home;
private final JavaAgentDetector javaAgentDetector;
private List<String> paths = new ArrayList<String>(DEFAULT_PATHS); private List<String> paths = new ArrayList<String>(DEFAULT_PATHS);
private final Properties properties = new Properties(); private final Properties properties = new Properties();
...@@ -138,11 +141,16 @@ public class PropertiesLauncher extends Launcher { ...@@ -138,11 +141,16 @@ public class PropertiesLauncher extends Launcher {
private Archive parent; private Archive parent;
public PropertiesLauncher() { public PropertiesLauncher() {
this(new InputArgumentsJavaAgentDetector());
}
PropertiesLauncher(JavaAgentDetector javaAgentDetector) {
if (!isDebug()) { if (!isDebug()) {
logger.setLevel(Level.SEVERE); logger.setLevel(Level.SEVERE);
} }
try { try {
this.home = getHomeDirectory(); this.home = getHomeDirectory();
this.javaAgentDetector = javaAgentDetector;
initializeProperties(this.home); initializeProperties(this.home);
initializePaths(); initializePaths();
this.parent = createArchive(); this.parent = createArchive();
...@@ -513,21 +521,12 @@ public class PropertiesLauncher extends Launcher { ...@@ -513,21 +521,12 @@ public class PropertiesLauncher extends Launcher {
ClassLoader parentClassLoader = getClass().getClassLoader(); ClassLoader parentClassLoader = getClass().getClassLoader();
List<Archive> urls = new ArrayList<Archive>(); List<Archive> urls = new ArrayList<Archive>();
for (URL url : getURLs(parentClassLoader)) { for (URL url : getURLs(parentClassLoader)) {
if (url.toString().endsWith(".jar") || url.toString().endsWith(".zip")) { if (!this.javaAgentDetector.isJavaAgentJar(url)) {
urls.add(new JarFileArchive(new File(url.toURI()))); Archive archive = createArchiveIfPossible(url);
} if (archive != null) {
else if (url.toString().endsWith("/*")) { urls.add(archive);
String name = url.getFile();
File dir = new File(name.substring(0, name.length() - 1));
if (dir.exists()) {
urls.add(new ExplodedArchive(
new File(name.substring(0, name.length() - 1)), false));
} }
} }
else {
String filename = URLDecoder.decode(url.getFile(), "UTF-8");
urls.add(new ExplodedArchive(new File(filename)));
}
} }
// The parent archive might have a "lib/" directory, meaning we are running from // The parent archive might have a "lib/" directory, meaning we are running from
// an executable JAR. We add nested entries from there with low priority (i.e. at // an executable JAR. We add nested entries from there with low priority (i.e. at
...@@ -541,6 +540,26 @@ public class PropertiesLauncher extends Launcher { ...@@ -541,6 +540,26 @@ public class PropertiesLauncher extends Launcher {
} }
} }
private Archive createArchiveIfPossible(URL url)
throws IOException, URISyntaxException {
if (url.toString().endsWith(".jar") || url.toString().endsWith(".zip")) {
return new JarFileArchive(new File(url.toURI()));
}
else if (url.toString().endsWith("/*")) {
String name = url.getFile();
File dir = new File(name.substring(0, name.length() - 1));
if (dir.exists()) {
return new ExplodedArchive(new File(name.substring(0, name.length() - 1)),
false);
}
}
else {
String filename = URLDecoder.decode(url.getFile(), "UTF-8");
return new ExplodedArchive(new File(filename));
}
return null;
}
private void addNestedArchivesFromParent(List<Archive> urls) { private void addNestedArchivesFromParent(List<Archive> urls) {
int index = findArchive(urls, this.parent); int index = findArchive(urls, this.parent);
if (index >= 0) { if (index >= 0) {
......
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,32 +22,45 @@ import java.net.URL; ...@@ -22,32 +22,45 @@ import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.loader.archive.Archive; import org.springframework.boot.loader.archive.Archive;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;
/** /**
* Tests for {@link PropertiesLauncher}. * Tests for {@link PropertiesLauncher}.
* *
* @author Dave Syer * @author Dave Syer
* @author Andy Wilkinson
*/ */
public class PropertiesLauncherTests { public class PropertiesLauncherTests {
@Mock
private JavaAgentDetector javaAgentDetector;
@Rule @Rule
public OutputCapture output = new OutputCapture(); public OutputCapture output = new OutputCapture();
@Before @Before
public void setup() throws IOException { public void setup() throws IOException {
MockitoAnnotations.initMocks(this);
System.setProperty("loader.home", System.setProperty("loader.home",
new File("src/test/resources").getAbsolutePath()); new File("src/test/resources").getAbsolutePath());
} }
...@@ -186,6 +199,22 @@ public class PropertiesLauncherTests { ...@@ -186,6 +199,22 @@ public class PropertiesLauncherTests {
assertEquals("[foo, bar]", Arrays.asList(launcher.getArgs("bar")).toString()); assertEquals("[foo, bar]", Arrays.asList(launcher.getArgs("bar")).toString());
} }
@Test
public void testJavaAgentJarsAreExcludedFromClasspath() throws Exception {
List<Archive> allArchives = new PropertiesLauncher().getClassPathArchives();
URL[] parentUrls = ((URLClassLoader) getClass().getClassLoader()).getURLs();
for (URL url : parentUrls) {
given(this.javaAgentDetector.isJavaAgentJar(url)).willReturn(true);
}
List<Archive> nonAgentArchives = new PropertiesLauncher(this.javaAgentDetector)
.getClassPathArchives();
assertThat(nonAgentArchives.size(),
is(equalTo(allArchives.size() - parentUrls.length)));
for (URL url : parentUrls) {
verify(this.javaAgentDetector).isJavaAgentJar(url);
}
}
private void waitFor(String value) throws Exception { private void waitFor(String value) throws Exception {
int count = 0; int count = 0;
boolean timeout = false; boolean timeout = false;
......
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