Index: features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java =================================================================== --- features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java (revision 8be067638747dfb27eb4d8e746c664aa12f4c5b3) +++ features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java (revision ) @@ -42,6 +42,7 @@ private List configurationFiles = new ArrayList(); public static String SPLIT_FOR_NAME_AND_VERSION = "_split_for_name_and_version_"; public static String DEFAULT_VERSION = "0.0.0"; + public static String VERSION_PREFIX = "version="; public FeatureImpl() { } Index: features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java =================================================================== --- features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java (revision 8be067638747dfb27eb4d8e746c664aa12f4c5b3) +++ features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java (revision ) @@ -16,41 +16,12 @@ */ package org.apache.karaf.features.internal; -import java.io.*; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.jar.JarInputStream; -import java.util.jar.Manifest; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import org.apache.felix.utils.manifest.Clause; import org.apache.felix.utils.manifest.Parser; import org.apache.felix.utils.version.VersionRange; import org.apache.felix.utils.version.VersionTable; -import org.apache.karaf.features.BundleInfo; -import org.apache.karaf.features.ConfigFileInfo; -import org.apache.karaf.features.Feature; -import org.apache.karaf.features.FeatureEvent; -import org.apache.karaf.features.FeaturesListener; -import org.apache.karaf.features.FeaturesService; -import org.apache.karaf.features.Repository; -import org.apache.karaf.features.RepositoryEvent; -import org.apache.karaf.features.Resolver; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; -import org.osgi.framework.Constants; -import org.osgi.framework.FrameworkEvent; -import org.osgi.framework.FrameworkListener; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.Version; +import org.apache.karaf.features.*; +import org.osgi.framework.*; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.packageadmin.PackageAdmin; @@ -59,16 +30,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.XMLConstants; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamSource; -import javax.xml.validation.SchemaFactory; -import javax.xml.validation.Schema; -import javax.xml.validation.Validator; +import java.io.*; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.jar.JarInputStream; +import java.util.jar.Manifest; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -import org.w3c.dom.Document; - import static java.lang.String.format; /** @@ -892,12 +865,32 @@ if (boot != null && !bootFeaturesInstalled) { new Thread() { public void run() { + // splitting the features String[] list = boot.split(","); Set features = new LinkedHashSet(); for (String f : list) { if (f.length() > 0) { + String featureVersion = null; + + // first we split the parts of the feature string to gain access to the version info + // if specified + String[] parts = f.split(";"); + String featureName = parts[0]; + for (String part : parts) { + // if the part starts with "version=" it contains the version info + if (part.startsWith(FeatureImpl.VERSION_PREFIX)) { + featureVersion = part.substring(FeatureImpl.VERSION_PREFIX.length()); + } + } + + if (featureVersion == null) { + // no version specified - use default version + featureVersion = FeatureImpl.DEFAULT_VERSION; + } + try { - Feature feature = getFeature(f, FeatureImpl.DEFAULT_VERSION); + // try to grab specific feature version + Feature feature = getFeature(featureName, featureVersion); if (feature != null) { features.add(feature); } else {