diff --git a/changelog.html b/changelog.html
index 910693ef0b..a88d49efae 100644
--- a/changelog.html
+++ b/changelog.html
@@ -56,10 +56,7 @@ Upcoming changes
- -
- Plugin dependencies are now strictly enforced during Jenkins startup, to avoid cryptic errors later.
- You may use
-Dhudson.PluginWrapper.dependenciesVersionCheck.enabled=false to revert to the old behavior.
- (issue 21486)
+ -
diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java
index 906f44fd7a..52e6e5ba13 100644
--- a/core/src/main/java/hudson/PluginManager.java
+++ b/core/src/main/java/hudson/PluginManager.java
@@ -679,8 +679,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
// so existing plugins can't be depending on this newly deployed one.
plugins.add(p);
- if (p.isActive())
- activePlugins.add(p);
+ activePlugins.add(p);
synchronized (((UberClassLoader) uberClassLoader).loaded) {
((UberClassLoader) uberClassLoader).loaded.clear();
}
diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java
index e5ca24513d..c30dba8ae2 100644
--- a/core/src/main/java/hudson/PluginWrapper.java
+++ b/core/src/main/java/hudson/PluginWrapper.java
@@ -87,12 +87,6 @@ import javax.annotation.Nonnull;
*/
@ExportedBean
public class PluginWrapper implements Comparable, ModelObject {
- /**
- * A plugin won't be loaded unless his declared dependencies are present and match the required minimal version.
- * This can be set to false to disable the version check (legacy behaviour)
- */
- private static final boolean ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK = Boolean.parseBoolean(System.getProperty(PluginWrapper.class.getName()+"." + "dependenciesVersionCheck.enabled", "true"));
-
/**
* {@link PluginManager} to which this belongs to.
*/
@@ -214,10 +208,10 @@ public class PluginWrapper implements Comparable, ModelObject {
if(idx==-1)
throw new IllegalArgumentException("Illegal dependency specifier "+s);
this.shortName = s.substring(0,idx);
- String version = s.substring(idx+1);
-
+ this.version = s.substring(idx+1);
+
boolean isOptional = false;
- String[] osgiProperties = version.split("[;]");
+ String[] osgiProperties = s.split(";");
for (int i = 1; i < osgiProperties.length; i++) {
String osgiProperty = osgiProperties[i].trim();
if (osgiProperty.equalsIgnoreCase("resolution:=optional")) {
@@ -225,16 +219,11 @@ public class PluginWrapper implements Comparable, ModelObject {
}
}
this.optional = isOptional;
- if (isOptional) {
- this.version = osgiProperties[0];
- } else {
- this.version = version;
- }
}
@Override
public String toString() {
- return shortName + " (" + version + ") " + (optional ? "optional" : "");
+ return shortName + " (" + version + ")";
}
}
@@ -398,21 +387,6 @@ public class PluginWrapper implements Comparable, ModelObject {
return "???";
}
- /**
- * Returns the required Jenkins core version of this plugin.
- * @return the required Jenkins core version of this plugin.
- * @since 1.657
- */
- @Exported
- public @CheckForNull String getRequiredCoreVersion() {
- String v = manifest.getMainAttributes().getValue("Jenkins-Version");
- if (v!= null) return v;
-
- v = manifest.getMainAttributes().getValue("Hudson-Version");
- if (v!= null) return v;
- return null;
- }
-
/**
* Returns the version number of this plugin
*/
@@ -539,71 +513,19 @@ public class PluginWrapper implements Comparable, ModelObject {
* thrown if one or several mandatory dependencies doesn't exists.
*/
/*package*/ void resolvePluginDependencies() throws IOException {
- if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK) {
- String requiredCoreVersion = getRequiredCoreVersion();
- if (requiredCoreVersion == null) {
- LOGGER.warning(shortName + " doesn't declare required core version.");
- } else {
- if (Jenkins.getVersion().isOlderThan(new VersionNumber(requiredCoreVersion))) {
- throw new IOException(shortName + " requires a more recent core version (" + requiredCoreVersion + ") than the current (" + Jenkins.getVersion() + ").");
- }
- }
- }
List missingDependencies = new ArrayList();
- List obsoleteDependencies = new ArrayList();
- List disabledDependencies = new ArrayList();
// make sure dependencies exist
for (Dependency d : dependencies) {
- PluginWrapper dependency = parent.getPlugin(d.shortName);
- if (dependency == null) {
+ if (parent.getPlugin(d.shortName) == null)
missingDependencies.add(d.toString());
- } else {
- if (dependency.isActive()) {
- if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version))) {
- obsoleteDependencies.add(dependency.getShortName() + "(" + dependency.getVersion() + " < " + d.version + ")");
- }
- } else {
- disabledDependencies.add(d.toString());
- }
-
- }
}
+ if (!missingDependencies.isEmpty())
+ throw new IOException("Dependency "+Util.join(missingDependencies, ", ")+" doesn't exist");
+
// add the optional dependencies that exists
for (Dependency d : optionalDependencies) {
- PluginWrapper dependency = parent.getPlugin(d.shortName);
- if (dependency != null && dependency.isActive()) {
- if (ENABLE_PLUGIN_DEPENDENCIES_VERSION_CHECK && dependency.getVersionNumber().isOlderThan(new VersionNumber(d.version))) {
- obsoleteDependencies.add(dependency.getShortName() + "(" + dependency.getVersion() + " < " + d.version + ")");
- } else {
- dependencies.add(d);
- }
- }
- }
- StringBuilder messageBuilder = new StringBuilder();
- if (!missingDependencies.isEmpty()) {
- boolean plural = missingDependencies.size() > 1;
- messageBuilder.append(plural ? "Dependencies " : "Dependency ")
- .append(Util.join(missingDependencies, ", "))
- .append(" ").append(plural ? "don't" : "doesn't")
- .append(" exist. ");
- }
- if (!disabledDependencies.isEmpty()) {
- boolean plural = disabledDependencies.size() > 1;
- messageBuilder.append(plural ? "Dependencies " : "Dependency ")
- .append(Util.join(missingDependencies, ", "))
- .append(" ").append(plural ? "are" : "is")
- .append(" disabled. ");
- }
- if (!obsoleteDependencies.isEmpty()) {
- boolean plural = obsoleteDependencies.size() > 1;
- messageBuilder.append(plural ? "Dependencies " : "Dependency ")
- .append(Util.join(obsoleteDependencies, ", "))
- .append(" ").append(plural ? "are" : "is")
- .append(" older than required.");
- }
- String message = messageBuilder.toString();
- if (!message.isEmpty()) {
- throw new IOException(message);
+ if (parent.getPlugin(d.shortName) != null)
+ dependencies.add(d);
}
}
diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java
index 777bf4d23f..913e3f4a15 100644
--- a/test/src/test/java/hudson/PluginManagerTest.java
+++ b/test/src/test/java/hudson/PluginManagerTest.java
@@ -47,7 +47,6 @@ import net.sf.json.JSONObject;
import org.apache.commons.io.FileUtils;
import org.apache.tools.ant.filters.StringInputStream;
import static org.junit.Assert.*;
-
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
@@ -340,75 +339,6 @@ public class PluginManagerTest {
assertTrue(r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty());
}
- @Issue("JENKINS-21486")
- @Test public void installPluginWithObsoleteDependencyFails() throws Exception {
- // Load dependee 0.0.1.
- {
- dynamicLoad("dependee.hpi");
- }
-
- // Load mandatory-depender 0.0.2, depending on dependee 0.0.2
- try {
- dynamicLoad("mandatory-depender-0.0.2.hpi");
- fail("Should not have worked");
- } catch (IOException e) {
- // Expected
- }
- }
-
- @Issue("JENKINS-21486")
- @Test public void installPluginWithDisabledOptionalDependencySucceeds() throws Exception {
- // Load dependee 0.0.2.
- {
- dynamicLoadAndDisable("dependee-0.0.2.hpi");
- }
-
- // Load depender 0.0.2, depending optionally on dependee 0.0.2
- {
- dynamicLoad("depender-0.0.2.hpi");
- }
-
- // dependee is not loaded so we cannot list any extension for it.
- try {
- r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint");
- fail();
- } catch( ClassNotFoundException _ ){
- }
- }
-
- @Issue("JENKINS-21486")
- @Test public void installPluginWithDisabledDependencyFails() throws Exception {
- // Load dependee 0.0.2.
- {
- dynamicLoadAndDisable("dependee-0.0.2.hpi");
- }
-
- // Load mandatory-depender 0.0.2, depending on dependee 0.0.2
- try {
- dynamicLoad("mandatory-depender-0.0.2.hpi");
- fail("Should not have worked");
- } catch (IOException e) {
- // Expected
- }
- }
-
-
- @Issue("JENKINS-21486")
- @Test public void installPluginWithObsoleteOptionalDependencyFails() throws Exception {
- // Load dependee 0.0.1.
- {
- dynamicLoad("dependee.hpi");
- }
-
- // Load depender 0.0.2, depending optionally on dependee 0.0.2
- try {
- dynamicLoad("depender-0.0.2.hpi");
- fail("Should not have worked");
- } catch (IOException e) {
- // Expected
- }
- }
-
@Issue("JENKINS-12753")
@WithPlugin("tasks.jpi")
@Test public void dynamicLoadRestartRequiredException() throws Exception {
@@ -447,8 +377,4 @@ public class PluginManagerTest {
private void dynamicLoad(String plugin) throws IOException, InterruptedException, RestartRequiredException {
PluginManagerUtil.dynamicLoad(plugin, r.jenkins);
}
-
- private void dynamicLoadAndDisable(String plugin) throws IOException, InterruptedException, RestartRequiredException {
- PluginManagerUtil.dynamicLoad(plugin, r.jenkins, true);
- }
}
diff --git a/test/src/test/java/hudson/PluginManagerUtil.java b/test/src/test/java/hudson/PluginManagerUtil.java
index 2263622b4c..e67b9b31f9 100644
--- a/test/src/test/java/hudson/PluginManagerUtil.java
+++ b/test/src/test/java/hudson/PluginManagerUtil.java
@@ -48,16 +48,9 @@ public class PluginManagerUtil {
}
public static void dynamicLoad(String plugin, Jenkins jenkins) throws IOException, InterruptedException, RestartRequiredException {
- dynamicLoad(plugin, jenkins, false);
- }
-
- public static void dynamicLoad(String plugin, Jenkins jenkins, boolean disable) throws IOException, InterruptedException, RestartRequiredException {
URL src = PluginManagerTest.class.getClassLoader().getResource("plugins/" + plugin);
File dest = new File(jenkins.getRootDir(), "plugins/" + plugin);
FileUtils.copyURLToFile(src, dest);
- if (disable) {
- new File(dest.getPath() + ".disabled").createNewFile();
- }
jenkins.pluginManager.dynamicLoad(dest);
}
}
diff --git a/test/src/test/java/hudson/PluginWrapperTest.java b/test/src/test/java/hudson/PluginWrapperTest.java
deleted file mode 100644
index 7529c53194..0000000000
--- a/test/src/test/java/hudson/PluginWrapperTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package hudson;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class PluginWrapperTest {
-
- @Test
- public void dependencyTest() {
- String version = "plugin:0.0.2";
- PluginWrapper.Dependency dependency = new PluginWrapper.Dependency(version);
- assertEquals("plugin", dependency.shortName);
- assertEquals("0.0.2", dependency.version);
- assertEquals(false, dependency.optional);
- }
-
- @Test
- public void optionalDependencyTest() {
- String version = "plugin:0.0.2;resolution:=optional";
- PluginWrapper.Dependency dependency = new PluginWrapper.Dependency(version);
- assertEquals("plugin", dependency.shortName);
- assertEquals("0.0.2", dependency.version);
- assertEquals(true, dependency.optional);
- }
-}
diff --git a/test/src/test/resources/plugins/dependee-0.0.2.hpi b/test/src/test/resources/plugins/dependee-0.0.2.hpi
deleted file mode 100644
index 79525b0846..0000000000
Binary files a/test/src/test/resources/plugins/dependee-0.0.2.hpi and /dev/null differ
diff --git a/test/src/test/resources/plugins/depender-0.0.2.hpi b/test/src/test/resources/plugins/depender-0.0.2.hpi
deleted file mode 100644
index 34826d3f77..0000000000
Binary files a/test/src/test/resources/plugins/depender-0.0.2.hpi and /dev/null differ
diff --git a/test/src/test/resources/plugins/mandatory-depender-0.0.2.hpi b/test/src/test/resources/plugins/mandatory-depender-0.0.2.hpi
deleted file mode 100644
index dedc65a62f..0000000000
Binary files a/test/src/test/resources/plugins/mandatory-depender-0.0.2.hpi and /dev/null differ