diff --git a/scm-it/pom.xml b/scm-it/pom.xml
index 9064a39fc1..c38c73ce3e 100644
--- a/scm-it/pom.xml
+++ b/scm-it/pom.xml
@@ -200,10 +200,6 @@
java.awt.headless
true
-
- sonia.scm.classloading.lifecycle
- simple
-
/scm
diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml
index b71d4043c2..ba3805b094 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -734,10 +734,6 @@
scm.stage
${scm.stage}
-
- sonia.scm.classloading.lifecycle
- simple
-
${project.basedir}/src/main/conf/jetty.xml
0
@@ -823,10 +819,6 @@
scm.home
target/scm-it
-
- sonia.scm.classloading.lifecycle
- simple
-
${project.basedir}/src/main/conf/jetty.xml
0
diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java
index e78e7b615c..a2ea3b7f9d 100644
--- a/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java
+++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java
@@ -11,6 +11,8 @@ import java.util.concurrent.atomic.AtomicLong;
/**
* Restart strategy which tries to free, every resource used by the context, starts gc and re initializes the context.
+ * Warning: This strategy should only be used with an classloader lifecycle which protects the
+ * created plugin classloader from classloader leaks.
*/
class InjectionContextRestartStrategy implements RestartStrategy {
diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java
index fb7d991c1e..683dbc8fbb 100644
--- a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java
+++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java
@@ -19,17 +19,17 @@ public abstract class ClassLoaderLifeCycle implements LifeCycle {
private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderLifeCycle.class);
@VisibleForTesting
- static final String PROPERTY = "sonia.scm.classloading.lifecycle";
+ static final String PROPERTY = "sonia.scm.lifecycle.classloading";
public static ClassLoaderLifeCycle create() {
ClassLoader webappClassLoader = Thread.currentThread().getContextClassLoader();
String implementation = System.getProperty(PROPERTY);
- if (SimpleClassLoaderLifeCycle.NAME.equalsIgnoreCase(implementation)) {
- LOG.info("create new simple ClassLoaderLifeCycle");
- return new SimpleClassLoaderLifeCycle(webappClassLoader);
+ if (ClassLoaderLifeCycleWithLeakPrevention.NAME.equalsIgnoreCase(implementation)) {
+ LOG.info("create new ClassLoaderLifeCycle with leak prevention");
+ return new ClassLoaderLifeCycleWithLeakPrevention(webappClassLoader);
}
- LOG.info("create new ClassLoaderLifeCycle with leak prevention");
- return new ClassLoaderLifeCycleWithLeakPrevention(webappClassLoader);
+ LOG.info("create new simple ClassLoaderLifeCycle");
+ return new SimpleClassLoaderLifeCycle(webappClassLoader);
}
private final ClassLoader webappClassLoader;
diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java
index e2e7a032b7..471f4ebc9f 100644
--- a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java
+++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java
@@ -26,6 +26,8 @@ import static se.jiderhamn.classloader.leak.prevention.cleanup.ShutdownHookClean
*/
final class ClassLoaderLifeCycleWithLeakPrevention extends ClassLoaderLifeCycle {
+ public static final String NAME = "with-leak-prevention";
+
private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderLifeCycleWithLeakPrevention.class);
private Deque classLoaders = new ArrayDeque<>();
diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java
index 619b09940e..9ca3a765d1 100644
--- a/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java
+++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java
@@ -17,9 +17,20 @@ class ClassLoaderLifeCycleTest {
}
}
+ @Test
+ void shouldCreateWithLeakPreventionClassLoader() {
+ System.setProperty(ClassLoaderLifeCycle.PROPERTY, ClassLoaderLifeCycleWithLeakPrevention.NAME);
+ try {
+ ClassLoaderLifeCycle classLoaderLifeCycle = ClassLoaderLifeCycle.create();
+ assertThat(classLoaderLifeCycle).isInstanceOf(ClassLoaderLifeCycleWithLeakPrevention.class);
+ } finally {
+ System.clearProperty(ClassLoaderLifeCycle.PROPERTY);
+ }
+ }
+
@Test
void shouldCreateDefaultClassLoader() {
ClassLoaderLifeCycle classLoaderLifeCycle = ClassLoaderLifeCycle.create();
- assertThat(classLoaderLifeCycle).isInstanceOf(ClassLoaderLifeCycleWithLeakPrevention.class);
+ assertThat(classLoaderLifeCycle).isInstanceOf(SimpleClassLoaderLifeCycle.class);
}
}