aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2019-06-26 08:59:28 +0200
committersonartech <sonartech@sonarsource.com>2019-06-28 08:45:52 +0200
commit198e19fe0c370f3a016c552f5a0fe0989f8b7dc4 (patch)
treeb273df3a4219360f0aed538e896785dcb6bdffb5
parent55b0758714f576d2b01b341d906d9be7122cd223 (diff)
downloadsonarqube-198e19fe0c370f3a016c552f5a0fe0989f8b7dc4.tar.gz
sonarqube-198e19fe0c370f3a016c552f5a0fe0989f8b7dc4.zip
SONAR-10286 Deprecate Plugin-ChildFirstClassLoader
-rw-r--r--sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java7
-rw-r--r--sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java16
2 files changed, 21 insertions, 2 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java b/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java
index f2927029e3f..88696f03e4a 100644
--- a/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java
+++ b/sonar-core/src/main/java/org/sonar/core/platform/PluginLoader.java
@@ -37,8 +37,8 @@ import static java.util.Arrays.asList;
* the entry point classes as defined in manifests. It assumes that JAR files are compatible with current
* environment (minimal sonarqube version, compatibility between plugins, ...):
* <ul>
- * <li>server verifies compatibility of JARs before deploying them at startup (see ServerPluginRepository)</li>
- * <li>batch loads only the plugins deployed on server (see BatchPluginRepository)</li>
+ * <li>server verifies compatibility of JARs before deploying them at startup (see ServerPluginRepository)</li>
+ * <li>batch loads only the plugins deployed on server (see BatchPluginRepository)</li>
* </ul>
* <p/>
* Plugins have their own isolated classloader, inheriting only from API classes.
@@ -93,6 +93,9 @@ public class PluginLoader {
// The plugins that extend other plugins can only add some files to classloader.
// They can't change metadata like ordering strategy or compatibility mode.
if (Strings.isNullOrEmpty(info.getBasePlugin())) {
+ if (info.isUseChildFirstClassLoader()) {
+ Loggers.get(getClass()).warn("Plugin {} [{}] uses a child first classloader which is deprecated", info.getName(), info.getKey());
+ }
def.setSelfFirstStrategy(info.isUseChildFirstClassLoader());
Version minSqVersion = info.getMinimalSqVersion();
boolean compatibilityMode = minSqVersion != null && minSqVersion.compareToIgnoreQualifier(COMPATIBILITY_MODE_MAX_VERSION) < 0;
diff --git a/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java b/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java
index 34496c3a397..56b458d7616 100644
--- a/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/platform/PluginLoaderTest.java
@@ -21,6 +21,7 @@ package org.sonar.core.platform;
import com.google.common.collect.ImmutableMap;
import java.io.File;
+import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -110,6 +111,21 @@ public class PluginLoaderTest {
}
@Test
+ public void log_warning_if_plugin_uses_child_first_classloader() throws IOException {
+ File jarFile = temp.newFile();
+ PluginInfo info = new PluginInfo("foo")
+ .setJarFile(jarFile)
+ .setUseChildFirstClassLoader(true)
+ .setMainClass("org.foo.FooPlugin");
+
+ Collection<PluginClassLoaderDef> defs = underTest.defineClassloaders(ImmutableMap.of("foo", info));
+ assertThat(defs).extracting(PluginClassLoaderDef::getBasePluginKey).containsExactly("foo");
+
+ List<String> warnings = logTester.logs(LoggerLevel.WARN);
+ assertThat(warnings).contains("Plugin foo [foo] uses a child first classloader which is deprecated");
+ }
+
+ @Test
public void log_warning_if_plugin_is_built_with_api_5_2_or_lower() throws Exception {
File jarFile = temp.newFile();
PluginInfo info = new PluginInfo("foo")