You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2020/09/24 12:28:36 UTC
[karaf] branch karaf-4.2.x updated: Fix main
This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch karaf-4.2.x
in repository https://gitbox.apache.org/repos/asf/karaf.git
The following commit(s) were added to refs/heads/karaf-4.2.x by this push:
new fbec94d Fix main
fbec94d is described below
commit fbec94d6b8af4ad4bf6188f98256525889083873
Author: jbonofre <jb...@apache.org>
AuthorDate: Thu Sep 24 14:28:30 2020 +0200
Fix main
---
main/src/main/java/org/apache/karaf/main/Main.java | 76 ++++++++++++----------
1 file changed, 41 insertions(+), 35 deletions(-)
diff --git a/main/src/main/java/org/apache/karaf/main/Main.java b/main/src/main/java/org/apache/karaf/main/Main.java
index 00cba42..18986d5 100644
--- a/main/src/main/java/org/apache/karaf/main/Main.java
+++ b/main/src/main/java/org/apache/karaf/main/Main.java
@@ -29,6 +29,7 @@ import java.lang.reflect.Proxy;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
+import java.nio.charset.StandardCharsets;
import java.security.Provider;
import java.security.Security;
import java.util.ArrayList;
@@ -90,7 +91,8 @@ public class Main {
private volatile boolean exiting;
private AutoCloseable shutdownThread;
private Thread monitorThread;
-
+ private URLClassLoader classLoader;
+
/**
* <p>
* This method performs the main task of constructing an framework instance
@@ -221,7 +223,7 @@ public class Main {
public void setShutdownCallback(ShutdownCallback shutdownCallback) {
this.shutdownCallback = shutdownCallback;
}
-
+
public void updateInstancePidAfterShutdown() throws Exception {
if (config == null) {
config = new ConfigProperties();
@@ -246,12 +248,12 @@ public class Main {
for (String provider : config.securityProviders) {
addSecurityProvider(provider);
}
-
+
List<File> bundleDirs = getBundleRepos();
ArtifactResolver resolver = new SimpleMavenResolver(bundleDirs);
// Start up the OSGI framework
- ClassLoader classLoader = createClassLoader(resolver);
+ classLoader = createClassLoader(resolver);
FrameworkFactory factory = loadFrameworkFactory(classLoader);
framework = factory.newFramework(config.props);
@@ -269,7 +271,7 @@ public class Main {
LOG.info("Installing and starting initial bundles");
File startupPropsFile = new File(config.karafEtc, STARTUP_PROPERTIES_FILE_NAME);
- List<BundleInfo> bundles = readBundlesFromStartupProperties(startupPropsFile);
+ List<BundleInfo> bundles = readBundlesFromStartupProperties(startupPropsFile);
installAndStartBundles(resolver, framework.getBundleContext(), bundles);
LOG.info("All initial bundles installed and set to start");
}
@@ -279,7 +281,7 @@ public class Main {
activatorManager = new KarafActivatorManager(classLoader, framework);
activatorManager.startKarafActivators();
-
+
setStartLevel(config.lockStartLevel);
// Progress bar
if (config.delayConsoleStart) {
@@ -342,29 +344,26 @@ public class Main {
final Class<?> signalHandlerClass = Class.forName("sun.misc.SignalHandler");
Object signalHandler = Proxy.newProxyInstance(getClass().getClassLoader(),
- new Class<?>[] {
- signalHandlerClass
- },
+ new Class<?>[] {
+ signalHandlerClass
+ },
(proxy, method, args) -> {
- new Thread() {
- @Override
- public void run() {
- try {
- exiting = true;
- framework.stop();
- } catch (BundleException e) {
- e.printStackTrace();
- }
+ new Thread(() -> {
+ try {
+ exiting = true;
+ framework.stop();
+ } catch (BundleException e) {
+ e.printStackTrace();
}
- }.start();
+ }).start();
return null;
}
);
signalClass.getMethod("handle", signalClass, signalHandlerClass).invoke(
- null,
- signalClass.getConstructor(String.class).newInstance("TERM"),
- signalHandler
+ null,
+ signalClass.getConstructor(String.class).newInstance("TERM"),
+ signalHandler
);
} catch (Exception e) {
}
@@ -482,7 +481,7 @@ public class Main {
}
}
- private ClassLoader createClassLoader(ArtifactResolver resolver) throws Exception {
+ private URLClassLoader createClassLoader(ArtifactResolver resolver) throws Exception {
List<URL> urls = new ArrayList<>();
urls.add(resolver.resolve(config.frameworkBundle).toURL());
File[] libs = new File(config.karafHome, "lib").listFiles();
@@ -493,14 +492,18 @@ public class Main {
}
}
}
- return new URLClassLoader(urls.toArray(new URL[urls.size()]), Main.class.getClassLoader());
+ return new URLClassLoader(urls.toArray(new URL[0]), getParentClassLoader());
+ }
+
+ protected ClassLoader getParentClassLoader() {
+ return Main.class.getClassLoader();
}
-
+
private FrameworkFactory loadFrameworkFactory(ClassLoader classLoader) throws Exception {
String factoryClass = config.frameworkFactoryClass;
if (factoryClass == null) {
InputStream is = classLoader.getResourceAsStream("META-INF/services/" + FrameworkFactory.class.getName());
- BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
factoryClass = br.readLine();
br.close();
}
@@ -517,7 +520,7 @@ public class Main {
} catch (Exception e) {
if (e instanceof InvocationTargetException){
throw new RuntimeException("Exception instantiating lock class " + config.lockClass
- + "\n" + ((InvocationTargetException)e).getTargetException().getMessage(), e);
+ + "\n" + ((InvocationTargetException)e).getTargetException().getMessage(), e);
}else{
throw new RuntimeException("Exception instantiating lock class " + config.lockClass, e);
}
@@ -531,7 +534,7 @@ public class Main {
System.err.println("Unable to register security provider: " + t);
}
}
-
+
public List<BundleInfo> readBundlesFromStartupProperties(File startupPropsFile) {
Properties startupProps = PropertiesLoader.loadPropertiesOrFail(startupPropsFile);
List<BundleInfo> bundeList = new ArrayList<>();
@@ -546,7 +549,7 @@ public class Main {
throw new RuntimeException("Error loading startup bundle list from " + startupPropsFile + " at " + key, e);
}
}
- return bundeList;
+ return bundeList;
}
private void installAndStartBundles(ArtifactResolver resolver, BundleContext context, List<BundleInfo> bundles) {
@@ -560,7 +563,7 @@ public class Main {
URI resolvedURI = resolver.resolve(temp);
final String asciiString = resolvedURI.toASCIIString();
if (asciiString.startsWith(home.toASCIIString()) ||
- asciiString.startsWith(base.toASCIIString())) {
+ asciiString.startsWith(base.toASCIIString())) {
b = context.installBundle(URI.create("reference:" + asciiString).toString());
} else {
throw new IllegalArgumentException("Can't resolve bundle '" + bundleInfo.uri + "'");
@@ -689,7 +692,7 @@ public class Main {
if (config.shutdownTimeout <= 0) {
timeout = Integer.MAX_VALUE;
}
-
+
if (shutdownCallback != null) {
shutdownCallback.waitingForShutdown(timeout);
}
@@ -706,7 +709,7 @@ public class Main {
}).start();
}
- int step = 5000;
+ int step = 5000;
while (timeout > 0) {
timeout -= step;
FrameworkEvent event = framework.waitForStop(step);
@@ -732,9 +735,12 @@ public class Main {
}
lock.release();
}
+ if (classLoader != null) {
+ classLoader.close();
+ }
}
}
-
+
private final class KarafLockCallback implements LockCallBack, FrameworkListener {
private Object startLevelLock = new Object();
@@ -793,7 +799,7 @@ public class Main {
startLevelLock.notifyAll();
}
}
- }
+ }
}
-}
+}
\ No newline at end of file