Skip to content

Commit

Permalink
Merge e6a9e95 into 7bf8645
Browse files Browse the repository at this point in the history
  • Loading branch information
circlespainter committed Sep 27, 2015
2 parents 7bf8645 + e6a9e95 commit 13a0cf2
Showing 1 changed file with 36 additions and 11 deletions.
47 changes: 36 additions & 11 deletions capsule/src/main/java/Capsule.java
Expand Up @@ -87,7 +87,6 @@
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXServiceURL;

import static java.util.Collections.*;
Expand Down Expand Up @@ -349,12 +348,12 @@ public class Capsule implements Runnable, InvocationHandler {
private static Capsule CAPSULE;
private static boolean AGENT;

final static Capsule myCapsule(List<String> args) {
final static Capsule myCapsule(Class<? extends Capsule> capsuleClass, List<String> args) {
if (CAPSULE == null) {
final ClassLoader ccl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(MY_CLASSLOADER);
Capsule capsule = newCapsule(MY_CLASSLOADER, findOwnJarFile());
Capsule capsule = newCapsule(MY_CLASSLOADER, findOwnJarFile(capsuleClass));
clearContext();
if ((AGENT || capsule.isEmptyCapsule()) && args != null && !args.isEmpty()) {
processCmdLineOptions(args, ManagementFactory.getRuntimeMXBean().getInputArguments());
Expand All @@ -371,6 +370,10 @@ final static Capsule myCapsule(List<String> args) {
return CAPSULE;
}

final static Capsule myCapsule(List<String> args) {
return myCapsule(null, args);
}

public static final void main(String[] args) {
System.exit(main0(args));
}
Expand Down Expand Up @@ -409,7 +412,7 @@ public static void premain(String agentArgs, Instrumentation inst) {
Capsule capsule = null;
try {
processOptions();
capsule = myCapsule(agentArgs != null ? new ArrayList<>(split(agentArgs, "\\s+")) : null);
capsule = myCapsule(Capsule.class, agentArgs != null ? new ArrayList<>(split(agentArgs, "\\s+")) : null);
for (Capsule c = capsule.cc; c != null; c = c.sup)
c.agent(inst);
} catch (Throwable t) {
Expand Down Expand Up @@ -1072,8 +1075,8 @@ public boolean isAgent() {

//<editor-fold defaultstate="collapsed" desc="Capsule JAR">
/////////// Capsule JAR ///////////////////////////////////
private static Path findOwnJarFile() {
final URL url = MY_CLASSLOADER.getResource(Capsule.class.getName().replace('.', '/') + ".class");
private static Path findOwnJarFile(Class<? extends Capsule> capsuleClass) {
final URL url = MY_CLASSLOADER.getResource((capsuleClass != null ? capsuleClass : Capsule.class).getName().replace('.', '/') + ".class");
assert url != null;
if (!"jar".equals(url.getProtocol()))
throw new IllegalStateException("The Capsule class must be in a JAR file, but was loaded from: " + url);
Expand All @@ -1089,6 +1092,10 @@ private static Path findOwnJarFile() {
}
}

private static Path findOwnJarFile() {
return findOwnJarFile(null);
}

private String toJarUrl(String relPath) {
return "jar:file:" + getJarFile().toAbsolutePath() + "!/" + relPath;
}
Expand Down Expand Up @@ -2281,9 +2288,9 @@ private List<Object> buildClassPath0(List<Object> classPath0) {
final long start = clock();
final List<Object> classPath = new ArrayList<>();

// the capsule jar
// The caplets and capsule jars
if (!isWrapperOfNonCapsule() && getAttribute(ATTR_CAPSULE_IN_CLASS_PATH))
classPath.add(getJarFile());
addCapsuleJars(classPath);

if (hasAttribute(ATTR_APP_ARTIFACT)) {
final String artifact = getAttribute(ATTR_APP_ARTIFACT);
Expand All @@ -2298,12 +2305,30 @@ private List<Object> buildClassPath0(List<Object> classPath0) {

classPath.addAll(nullToEmpty(getAttribute(ATTR_DEPENDENCIES)));

// the capsule jar
// The caplets and capsule jars
if (!isWrapperOfNonCapsule() && isDeepEmpty(classPath))
classPath.add(getJarFile());
addCapsuleJars(classPath);

// Remove duplicate JARs while preserving order
final List<Object> ret = new ArrayList<>(new LinkedHashSet<>(classPath));

time("buildClassPath", start);
return classPath;

return ret;
}

private void addCapsuleJars(List<Object> classPath) {
Capsule c = this.cc;
do {
Path p = null;
try {
p = findOwnJarFile(c.getClass());
} catch (final IllegalStateException ignored) {} // Ignore non-JARs
if (p != null)
classPath.add(p);
} while ((c = sup) != null);

classPath.add(getJarFile());
}

/**
Expand Down

0 comments on commit 13a0cf2

Please sign in to comment.