Prevent loading Feature/DynamicFeature services multiple times.

Signed-off-by: jansupol <jan.supol@oracle.com>
diff --git a/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java
index dbc4308..61b7eb5 100644
--- a/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/AbstractFeatureConfigurator.java
@@ -24,6 +24,7 @@
 
 import javax.ws.rs.RuntimeType;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -62,7 +63,7 @@
      * @param features list of features to be registered
      * @param bootstrapBag place where features are being registered
      */
-    protected void registerFeatures(List<Class<T>> features,
+    protected void registerFeatures(Collection<Class<T>> features,
                                     BootstrapBag bootstrapBag) {
         final List<AutoDiscoverable> autoDiscoverables = new ArrayList<>();
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
index ed2c8fb..f8ea866 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/DynamicFeatureConfigurator.java
@@ -22,8 +22,10 @@
 
 import javax.ws.rs.RuntimeType;
 import javax.ws.rs.container.DynamicFeature;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Registers JAX-RS {@link DynamicFeature} which are listed as SPIs for registration.
@@ -51,7 +53,8 @@
     public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
         final Map<String, Object> properties = bootstrapBag.getConfiguration().getProperties();
         if (PropertiesHelper.isJaxRsServiceLoadingEnabled(properties)) {
-            final List<Class<DynamicFeature>> dynamicFeatures = loadImplementations(properties);
+            final Set<Class<DynamicFeature>> dynamicFeatures = new HashSet<>();
+            dynamicFeatures.addAll(loadImplementations(properties));
             dynamicFeatures.addAll(loadImplementations(properties, DynamicFeature.class.getClassLoader()));
 
             registerFeatures(dynamicFeatures, bootstrapBag);
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java b/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
index 24a24fb..4985407 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/FeatureConfigurator.java
@@ -22,8 +22,9 @@
 
 import javax.ws.rs.RuntimeType;
 import javax.ws.rs.core.Feature;
-import java.util.List;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Registers JAX-RS {@link Feature} which are listed as SPIs for registration.
@@ -44,7 +45,8 @@
     public void init(InjectionManager injectionManager, BootstrapBag bootstrapBag) {
         final Map<String, Object> properties = bootstrapBag.getConfiguration().getProperties();
         if (PropertiesHelper.isJaxRsServiceLoadingEnabled(properties)) {
-            final List<Class<Feature>> features = loadImplementations(properties);
+            final Set<Class<Feature>> features = new HashSet<>();
+            features.addAll(loadImplementations(properties));
             features.addAll(loadImplementations(properties, Feature.class.getClassLoader()));
 
             registerFeatures(features, bootstrapBag);