You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/07/04 11:02:03 UTC

[2/3] camel git commit: CAMEL-10118: Improvements to spring-boot testing framework

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSalesforceTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSalesforceTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSalesforceTest.java
index f83f131..c122e2d 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSalesforceTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSalesforceTest.java
@@ -35,6 +35,8 @@ public class CamelSalesforceTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSalesforceTest.class))
+                .basePath("../../components/camel-salesforce/camel-salesforce-component")
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest.*|MSPTest$)")
                 .autostart(false) // needs configuration
                 .build();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSapNetweaverTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSapNetweaverTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSapNetweaverTest.java
index e3f83d2..f7b058c 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSapNetweaverTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSapNetweaverTest.java
@@ -35,6 +35,8 @@ public class CamelSapNetweaverTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSapNetweaverTest.class))
+                .unitTestInclusionPattern("^$") // no pure unit-tests
+                .unitTestExpectedNumber(0)
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelScalaTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelScalaTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelScalaTest.java
index ca1a39c..73131b8 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelScalaTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelScalaTest.java
@@ -35,6 +35,7 @@ public class CamelScalaTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelScalaTest.class))
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest$|LoopTest$|IdempotentConsumerEagerTest$|AutoStartupTest$)") // no runnable methods on these tests
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServicenowTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServicenowTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServicenowTest.java
index 9cf07c7..095fe34 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServicenowTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServicenowTest.java
@@ -35,6 +35,8 @@ public class CamelServicenowTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelServicenowTest.class))
+                .unitTestInclusionPattern("^$") // no tests
+                .unitTestExpectedNumber(0)
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServletTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServletTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServletTest.java
index aad8988..0b8f3a5 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServletTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelServletTest.java
@@ -35,6 +35,9 @@ public class CamelServletTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelServletTest.class))
+//                .dependency(DependencyResolver.withVersion("org.springframework.boot:spring-boot-starter-web"))
+//                .dependency(DependencyResolver.withVersion("org.springframework:spring-webmvc"))
+                .unitTestExclusionPattern(".*ExposedServletEndpointURIToJMXTest")
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSjmsTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSjmsTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSjmsTest.java
index fdd69e3..26e6ec2 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSjmsTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSjmsTest.java
@@ -35,12 +35,16 @@ public class CamelSjmsTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSjmsTest.class))
+//                .dependency("com.atomikos:transactions-jdbc:3.9.3")
+//                .dependency("com.atomikos:transactions-jms:3.9.3")
+//                .dependency("javax.transaction:javax.transaction-api:1.2")
+//                .disableJmx("org.apache.activemq:*")
                 .build();
     }
 
     @Test
     public void componentTests() throws Exception {
-        this.runComponentTest(config);
+        //this.runComponentTest(config);
         this.runModuleUnitTestsIfEnabled(config);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSlackTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSlackTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSlackTest.java
index 117bef4..964249a 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSlackTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSlackTest.java
@@ -35,6 +35,8 @@ public class CamelSlackTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSlackTest.class))
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest$|SlackProducerTest$)") // excluding blueprint tests
+                .unitTestExpectedNumber(0)
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSmppTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSmppTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSmppTest.java
index fc73d4a..ff22c52 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSmppTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSmppTest.java
@@ -35,6 +35,9 @@ public class CamelSmppTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSmppTest.class))
+                .unitTestInclusionPattern("^$")
+                .unitTestExpectedNumber(0)
+                // The only unit test that can be run has a log-level dependent outcome...
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSparkRestTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSparkRestTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSparkRestTest.java
index fa5c364..8d2baba 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSparkRestTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSparkRestTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.springboot;
 
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.apache.camel.itest.springboot.util.DependencyResolver;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -35,6 +36,7 @@ public class CamelSparkRestTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSparkRestTest.class))
+                .dependency(DependencyResolver.withVersion("org.hibernate:hibernate-validator"))
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringRedisTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringRedisTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringRedisTest.java
index 6e77d9f..6ea8a98 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringRedisTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringRedisTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.springboot;
 
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.apache.camel.itest.springboot.util.DependencyResolver;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -27,8 +28,6 @@ import org.junit.runner.RunWith;
 @RunWith(Arquillian.class)
 public class CamelSpringRedisTest extends AbstractSpringBootTestSupport {
 
-    private static final String SPRING_DATA_REDIS_VERSION = System.getProperty("springDataRedisVersion", "1.6.4.RELEASE");
-
     @Deployment
     public static Archive<?> createSpringBootPackage() throws Exception {
         return ArquillianPackager.springBootPackage(createTestConfig());
@@ -37,7 +36,7 @@ public class CamelSpringRedisTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSpringRedisTest.class))
-                .dependency("org.springframework.data:spring-data-redis:" + SPRING_DATA_REDIS_VERSION)
+                .dependency(DependencyResolver.withVersion("org.springframework.data:spring-data-redis"))
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringTest.java
index 07616a5..14502c0 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringTest.java
@@ -35,6 +35,7 @@ public class CamelSpringTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSpringTest.class))
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest$|ManagedRefEndpointTest$|SpringLogProcessorWithProvidedLoggerTest$|SpringManagedCamelContextTest$)")
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringWsTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringWsTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringWsTest.java
index bf5e2c9..dcfd97e 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringWsTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSpringWsTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.springboot;
 
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.apache.camel.itest.springboot.util.DependencyResolver;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -35,6 +36,8 @@ public class CamelSpringWsTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSpringWsTest.class))
+                .dependency(DependencyResolver.withVersion("org.springframework.boot:spring-boot-starter-web"))
+                .dependency(DependencyResolver.withVersion("org.springframework:spring-webmvc"))
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelStreamTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelStreamTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelStreamTest.java
index ecbd44b..fb1fa03 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelStreamTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelStreamTest.java
@@ -35,6 +35,9 @@ public class CamelStreamTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelStreamTest.class))
+                .customLog(false)
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest$|StreamToUrlTest$)")
+                // Spring provides its own URL handlers for schema "mock:"
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerJavaTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerJavaTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerJavaTest.java
index ee4c35a..ef8a043 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerJavaTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerJavaTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.springboot;
 
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.apache.camel.itest.springboot.util.DependencyResolver;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -27,8 +28,6 @@ import org.junit.runner.RunWith;
 @RunWith(Arquillian.class)
 public class CamelSwaggerJavaTest extends AbstractSpringBootTestSupport {
 
-    private static final String HIBERNATE_VALIDATOR_VERSION = System.getProperty("hibernateValidatorVersion", "5.2.4.Final");
-
     @Deployment
     public static Archive<?> createSpringBootPackage() throws Exception {
         return ArquillianPackager.springBootPackage(createTestConfig());
@@ -37,7 +36,7 @@ public class CamelSwaggerJavaTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelSwaggerJavaTest.class))
-                .dependency("org.hibernate:hibernate-validator:" + HIBERNATE_VALIDATOR_VERSION)
+                .dependency(DependencyResolver.withVersion("org.hibernate:hibernate-validator"))
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerTest.java
deleted file mode 100644
index 3aacefc..0000000
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelSwaggerTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.itest.springboot;
-
-import org.apache.camel.itest.springboot.util.ArquillianPackager;
-import org.jboss.arquillian.container.test.api.Deployment;
-import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.shrinkwrap.api.Archive;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-
-@RunWith(Arquillian.class)
-public class CamelSwaggerTest extends AbstractSpringBootTestSupport {
-
-    private static final String HIBERNATE_VALIDATOR_VERSION = System.getProperty("hibernateValidatorVersion", "5.2.4.Final");
-
-    @Deployment
-    public static Archive<?> createSpringBootPackage() throws Exception {
-        return ArquillianPackager.springBootPackage(createTestConfig());
-    }
-
-    public static ITestConfig createTestConfig() {
-        return new ITestConfigBuilder()
-                .module(inferModuleName(CamelSwaggerTest.class))
-                .dependency("org.hibernate:hibernate-validator:" + HIBERNATE_VALIDATOR_VERSION)
-                .build();
-    }
-
-    @Test
-    public void componentTests() throws Exception {
-        // no component test
-        this.runModuleUnitTestsIfEnabled(config);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelTwitterTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelTwitterTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelTwitterTest.java
index 53265b9..441c570 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelTwitterTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelTwitterTest.java
@@ -35,7 +35,7 @@ public class CamelTwitterTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelTwitterTest.class))
-                .unitTestExclusionPattern(".*(DirectMessageDirectTest|DirectMessagePollingTest)$")
+                .unitTestInclusionPattern(".*UriConfigurationTest$")
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelUndertowTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelUndertowTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelUndertowTest.java
index 9749630..a7d9e62 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelUndertowTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelUndertowTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.springboot;
 
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.apache.camel.itest.springboot.util.DependencyResolver;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -35,6 +36,8 @@ public class CamelUndertowTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelUndertowTest.class))
+                .dependency(DependencyResolver.withVersion("org.hibernate:hibernate-validator"))
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest$|BaseUndertowTest$|UndertowHttpsSpringTest$)")
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWeatherTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWeatherTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWeatherTest.java
index 6cc023c..05fa69f 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWeatherTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWeatherTest.java
@@ -35,13 +35,14 @@ public class CamelWeatherTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelWeatherTest.class))
+                .unitTestExclusionPattern(".*(\\.integration\\..*|IntegrationTest$|BaseUndertowTest$)")
                 .build();
     }
 
     @Test
     public void componentTests() throws Exception {
         this.runComponentTest(config);
-        this.runModuleUnitTestsIfEnabled(config);
+        // skip tests
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWebsocketTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWebsocketTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWebsocketTest.java
index 65c8301..8e12f50 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWebsocketTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelWebsocketTest.java
@@ -35,6 +35,7 @@ public class CamelWebsocketTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelWebsocketTest.class))
+                .unitTestExclusionPattern(".*(WebsocketEndpointTest|WebsocketComponentTest)$")
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmljsonTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmljsonTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmljsonTest.java
index 542b88a..ea7a3e4 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmljsonTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmljsonTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.springboot;
 
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.apache.camel.itest.springboot.util.DependencyResolver;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -35,6 +36,7 @@ public class CamelXmljsonTest extends AbstractSpringBootTestSupport {
     public static ITestConfig createTestConfig() {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelXmljsonTest.class))
+                .dependency(DependencyResolver.withVersion("xom:xom"))
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmppTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmppTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmppTest.java
index 8ef4c89..1aa9c64 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmppTest.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelXmppTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.itest.springboot;
 
+import java.io.File;
+import java.io.IOException;
+
 import org.apache.camel.itest.springboot.util.ArquillianPackager;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
@@ -32,13 +35,15 @@ public class CamelXmppTest extends AbstractSpringBootTestSupport {
         return ArquillianPackager.springBootPackage(createTestConfig());
     }
 
-    public static ITestConfig createTestConfig() {
+    public static ITestConfig createTestConfig() throws IOException {
         return new ITestConfigBuilder()
                 .module(inferModuleName(CamelXmppTest.class))
+                .systemProperty("javax.net.ssl.trustStore", new File("../../components/camel-xmpp/src/test/resources/xmppServer.jks").getCanonicalPath())
                 .build();
     }
 
     @Test
+//    @Ignore
     public void componentTests() throws Exception {
         this.runComponentTest(config);
         this.runModuleUnitTestsIfEnabled(config);

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerConfiguration.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerConfiguration.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerConfiguration.java
new file mode 100644
index 0000000..3f3d12c
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerConfiguration.java
@@ -0,0 +1,102 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container;
+
+import java.util.logging.Level;
+
+import org.jboss.arquillian.container.spi.ConfigurationException;
+import org.jboss.arquillian.container.spi.client.container.ContainerConfiguration;
+
+public class ManagedSEContainerConfiguration implements ContainerConfiguration {
+
+    private boolean debug;
+    private String host = "127.0.0.1";
+    private int port = 9999;
+    private String librariesPath;
+    private Level logLevel = Level.INFO;
+    private boolean keepDeploymentArchives;
+    private String additionalJavaOpts;
+    private int waitTime = 5;
+
+    public void validate() throws ConfigurationException {
+    }
+
+    public void setWaitTime(int waitTime) {
+        this.waitTime = waitTime;
+    }
+
+    public int getWaitTime() {
+        return waitTime;
+    }
+
+    public boolean isDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getLibrariesPath() {
+        return librariesPath;
+    }
+
+    public void setLibrariesPath(String librariesPath) {
+        this.librariesPath = librariesPath;
+    }
+
+    public Level getLogLevel() {
+        return logLevel;
+    }
+
+    public void setLogLevel(String logLevel) {
+        this.logLevel = Level.parse(logLevel);
+    }
+
+    public boolean isKeepDeploymentArchives() {
+        return keepDeploymentArchives;
+    }
+
+    public void setKeepDeploymentArchives(boolean keepDeploymentArchives) {
+        this.keepDeploymentArchives = keepDeploymentArchives;
+    }
+
+    public String getAdditionalJavaOpts() {
+        return additionalJavaOpts;
+    }
+
+    public void setAdditionalJavaOpts(String additionalJavaOpts) {
+        this.additionalJavaOpts = additionalJavaOpts;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerExtension.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerExtension.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerExtension.java
new file mode 100644
index 0000000..f870d24
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEContainerExtension.java
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container;
+
+import org.apache.camel.itest.springboot.arquillian.container.jmx.CustomJMXProtocol;
+import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
+import org.jboss.arquillian.container.test.spi.client.deployment.AuxiliaryArchiveAppender;
+import org.jboss.arquillian.container.test.spi.client.protocol.Protocol;
+import org.jboss.arquillian.core.spi.LoadableExtension;
+
+public class ManagedSEContainerExtension implements LoadableExtension {
+
+    @Override
+    public void register(final ExtensionBuilder builder) {
+        builder.service(DeployableContainer.class, ManagedSEDeployableContainer.class);
+        builder.service(Protocol.class, CustomJMXProtocol.class);
+        builder.service(AuxiliaryArchiveAppender.class, SEContainerAppender.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEDeployableContainer.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEDeployableContainer.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEDeployableContainer.java
new file mode 100644
index 0000000..3503be9
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/ManagedSEDeployableContainer.java
@@ -0,0 +1,397 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.apache.camel.itest.springboot.arquillian.container.jmx.CustomJMXProtocol;
+import org.apache.camel.itest.springboot.arquillian.container.util.Await;
+import org.apache.camel.itest.springboot.arquillian.container.util.FileDeploymentUtils;
+import org.jboss.arquillian.container.se.api.ClassPath;
+import org.jboss.arquillian.container.se.api.ClassPathDirectory;
+import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
+import org.jboss.arquillian.container.spi.client.container.DeploymentException;
+import org.jboss.arquillian.container.spi.client.container.LifecycleException;
+import org.jboss.arquillian.container.spi.client.protocol.ProtocolDescription;
+import org.jboss.arquillian.container.spi.client.protocol.metadata.JMXContext;
+import org.jboss.arquillian.container.spi.client.protocol.metadata.ProtocolMetaData;
+import org.jboss.arquillian.protocol.jmx.JMXTestRunnerMBean;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.Node;
+import org.jboss.shrinkwrap.api.asset.ArchiveAsset;
+import org.jboss.shrinkwrap.api.asset.Asset;
+import org.jboss.shrinkwrap.api.asset.ClassAsset;
+import org.jboss.shrinkwrap.api.exporter.ZipExporter;
+import org.jboss.shrinkwrap.descriptor.api.Descriptor;
+
+public class ManagedSEDeployableContainer implements DeployableContainer<ManagedSEContainerConfiguration> {
+
+    private static final Logger LOGGER = Logger.getLogger(ManagedSEDeployableContainer.class.getName());
+    private static final String SYSPROP_KEY_JAVA_HOME = "java.home";
+    private static final String DEBUG_AGENT_STRING = "-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y";
+    private static final String TARGET = "target";
+    private static final String SERVER_MAIN_CLASS_FQN = "org.jboss.arquillian.container.se.server.Main";
+    private static final String SYSTEM_PROPERTY_SWITCH = "-D";
+    private static final String EQUALS = "=";
+
+    private boolean debugModeEnabled;
+    private boolean keepDeploymentArchives;
+    private Process process;
+    private List<File> materializedFiles;
+    private List<File> classpathDependencies;
+    private String host;
+    private int port;
+    private String librariesPath;
+    private List<String> additionalJavaOpts;
+    private int waitTime;
+
+    @Override
+    public Class<ManagedSEContainerConfiguration> getConfigurationClass() {
+        return ManagedSEContainerConfiguration.class;
+    }
+
+    public void setup(ManagedSEContainerConfiguration configuration) {
+        debugModeEnabled = configuration.isDebug();
+        host = configuration.getHost();
+        port = configuration.getPort();
+        materializedFiles = new ArrayList<>();
+        classpathDependencies = new ArrayList<>();
+        librariesPath = configuration.getLibrariesPath();
+        keepDeploymentArchives = configuration.isKeepDeploymentArchives();
+        additionalJavaOpts = initAdditionalJavaOpts(configuration.getAdditionalJavaOpts());
+        configureLogging(configuration);
+        waitTime = configuration.getWaitTime() > 0 ? configuration.getWaitTime() : 10;
+    }
+
+    private List<String> initAdditionalJavaOpts(String opts) {
+        if (opts == null || opts.isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<String> additionalOpts = new ArrayList<>();
+
+        for (String option : opts.split("\\s+")) {
+            additionalOpts.add(option);
+        }
+        return additionalOpts;
+    }
+
+    private void configureLogging(ManagedSEContainerConfiguration configuration) {
+        ConsoleHandler consoleHandler = new ConsoleHandler();
+        consoleHandler.setLevel(configuration.getLogLevel());
+        LOGGER.setUseParentHandlers(false);
+        LOGGER.addHandler(consoleHandler);
+        LOGGER.setLevel(configuration.getLogLevel());
+    }
+
+    @Override
+    public void start() throws LifecycleException {
+    }
+
+    @Override
+    public void stop() throws LifecycleException {
+    }
+
+    @Override
+    public ProtocolDescription getDefaultProtocol() {
+        return new ProtocolDescription(CustomJMXProtocol.NAME);
+    }
+
+    @Override
+    public void deploy(Descriptor descriptor) throws DeploymentException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void undeploy(Descriptor descriptor) throws DeploymentException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void undeploy(Archive<?> archive) throws DeploymentException {
+        LOGGER.info("Undeploying " + archive.getName());
+        if (!keepDeploymentArchives) {
+            for (File materializedFile : materializedFiles) {
+                if (materializedFile.isDirectory()) {
+                    try {
+                        FileDeploymentUtils.deleteRecursively(materializedFile.toPath());
+                    } catch (IOException e) {
+                        LOGGER.warning("Could not delete materialized directory: " + materializedFile);
+                    }
+                } else {
+                    materializedFile.delete();
+                }
+            }
+        }
+        // Kill the subprocess (test JVM)
+        if (process != null) {
+            process.destroy();
+            try {
+                process.waitFor();
+            } catch (final InterruptedException e) {
+                Thread.interrupted();
+                throw new RuntimeException("Interrupted while awaiting server daemon process termination", e);
+            }
+        }
+    }
+
+    @Override
+    public ProtocolMetaData deploy(final Archive<?> archive) throws DeploymentException {
+        LOGGER.info("Deploying " + archive.getName());
+
+        // First of all clear the list of previously materialized deployments - otherwise the class path would grow indefinitely
+        materializedFiles.clear();
+
+        // Create a new classpath
+        classpathDependencies.clear();
+
+        if (ClassPath.isRepresentedBy(archive)) {
+            for (Node child : archive.get(ClassPath.ROOT_ARCHIVE_PATH).getChildren()) {
+                Asset asset = child.getAsset();
+                if (asset instanceof ArchiveAsset) {
+                    Archive<?> assetArchive = ((ArchiveAsset) asset).getArchive();
+                    if (ClassPathDirectory.isRepresentedBy(assetArchive)) {
+                        materializeDirectory(assetArchive);
+                    } else {
+                        materializeArchive(assetArchive);
+                    }
+                }
+            }
+        } else {
+            materializeArchive(archive);
+        }
+
+        Properties systemProperties = getSystemProperties(archive);
+        readJarFilesFromDirectory();
+        addTestResourcesDirectory(systemProperties);
+
+        List<String> processCommand = buildProcessCommand(systemProperties);
+        logExecutedCommand(processCommand);
+        // Launch the process
+        final ProcessBuilder processBuilder = new ProcessBuilder(processCommand);
+
+        String path = systemProperties.getProperty("container.user.dir");
+        if (path != null) {
+            processBuilder.directory(new File(path));
+        }
+
+        processBuilder.environment().put("JAVA_HOME", new File(System.getProperty(SYSPROP_KEY_JAVA_HOME)).getAbsolutePath());
+
+        processBuilder.redirectErrorStream(true);
+        processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
+        processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
+
+        try {
+            process = processBuilder.start();
+        } catch (final IOException e) {
+            throw new DeploymentException("Could not start process", e);
+        }
+
+        int finalWaitTime = debugModeEnabled ? (3 * waitTime) : waitTime;
+
+        // Wait for socket connection
+        if (!isServerStarted(host, port, finalWaitTime)) {
+            throw new DeploymentException("Child JVM process failed to start within " + finalWaitTime + " seconds.");
+        }
+        if (!isJMXTestRunnerMBeanRegistered(host, port, finalWaitTime)) {
+            throw new DeploymentException("JMXTestRunnerMBean not registered within " + finalWaitTime + " seconds.");
+        }
+
+        ProtocolMetaData protocolMetaData = new ProtocolMetaData();
+        protocolMetaData.addContext(new JMXContext(host, port));
+        return protocolMetaData;
+    }
+
+    private Properties getSystemProperties(final Archive<?> archive) throws DeploymentException {
+        Node systemPropertiesNode = archive.get(ClassPath.SYSTEM_PROPERTIES_ARCHIVE_PATH);
+        if (systemPropertiesNode != null) {
+            try (InputStream in = systemPropertiesNode.getAsset().openStream()) {
+                Properties systemProperties = new Properties();
+                systemProperties.load(in);
+                return systemProperties;
+            } catch (IOException e) {
+                throw new DeploymentException("Could not load system properties", e);
+            }
+        }
+        return null;
+    }
+
+    private boolean isServerStarted(final String host, final int port, int waitTime) {
+        return new Await(waitTime, new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                try (Socket ignored = new Socket(host, port)) {
+                    return true;
+                }
+            }
+        }).start();
+    }
+
+    private boolean isJMXTestRunnerMBeanRegistered(final String host, final int port, int waitTime) throws DeploymentException {
+        // Taken from org.jboss.arquillian.container.spi.client.protocol.metadata.JMXContext
+        final String jmxServiceUrl = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
+        try (JMXConnector jmxc = JMXConnectorFactory.connect(new JMXServiceURL(jmxServiceUrl), null)) {
+            final MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
+            return new Await(waitTime, new Callable<Boolean>() {
+                @Override
+                public Boolean call() throws Exception {
+                    mbsc.getObjectInstance(new ObjectName(JMXTestRunnerMBean.OBJECT_NAME));
+                    LOGGER.fine("JMXTestRunnerMBean registered with the remote MBean server at: " + jmxServiceUrl);
+                    return true;
+                }
+            }).start();
+        } catch (IOException e) {
+            throw new DeploymentException("Could not verify JMXTestRunnerMBean registration", e);
+        }
+    }
+
+    private void materializeArchive(Archive<?> archive) {
+        File deploymentFile = new File(TARGET.concat(File.separator).concat(archive.getName()));
+        archive.as(ZipExporter.class).exportTo(deploymentFile, true);
+        materializedFiles.add(deploymentFile);
+    }
+
+    private void materializeDirectory(Archive<?> archive) throws DeploymentException {
+        if (archive.getContent().isEmpty()) {
+            // Do not materialize an empty directory
+            return;
+        }
+        File entryDirectory = new File(TARGET.concat(File.separator).concat(archive.getName()));
+        try {
+            if (entryDirectory.exists()) {
+                // Always delete previous content
+                FileDeploymentUtils.deleteContent(entryDirectory.toPath());
+            } else {
+                if (!entryDirectory.mkdirs()) {
+                    throw new DeploymentException("Could not create class path directory: " + entryDirectory);
+                }
+            }
+            for (Node child : archive.get(ClassPath.ROOT_ARCHIVE_PATH).getChildren()) {
+                Asset asset = child.getAsset();
+                if (asset instanceof ClassAsset) {
+                    FileDeploymentUtils.materializeClass(entryDirectory, (ClassAsset) asset);
+                } else if (asset == null) {
+                    FileDeploymentUtils.materializeSubdirectories(entryDirectory, child);
+                }
+            }
+        } catch (IOException e) {
+            throw new DeploymentException("Could not materialize class path directory: " + archive.getName(), e);
+        }
+        materializedFiles.add(entryDirectory);
+    }
+
+    private List<String> buildProcessCommand(Properties properties) {
+        final List<String> command = new ArrayList<String>();
+        final File javaHome = new File(System.getProperty(SYSPROP_KEY_JAVA_HOME));
+        command.add(javaHome.getAbsolutePath() + File.separator + "bin" + File.separator + "java");
+        command.add("-cp");
+        StringBuilder builder = new StringBuilder();
+        Set<File> classPathEntries = new HashSet<>(materializedFiles);
+        classPathEntries.addAll(classpathDependencies);
+        for (Iterator<File> iterator = classPathEntries.iterator(); iterator.hasNext();) {
+            builder.append(iterator.next().getPath());
+            if (iterator.hasNext()) {
+                builder.append(File.pathSeparator);
+            }
+        }
+        command.add(builder.toString());
+        command.add("-Dcom.sun.management.jmxremote");
+        command.add("-Dcom.sun.management.jmxremote.port=" + port);
+        command.add("-Dcom.sun.management.jmxremote.authenticate=false");
+        command.add("-Dcom.sun.management.jmxremote.ssl=false");
+
+        if (debugModeEnabled) {
+            command.add(DEBUG_AGENT_STRING);
+        }
+        for (String option : additionalJavaOpts) {
+            command.add(option);
+        }
+        if (properties != null) {
+            for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+                addSystemProperty(command, entry.getKey().toString(), entry.getValue().toString());
+            }
+        }
+        command.add(SERVER_MAIN_CLASS_FQN);
+        return command;
+    }
+
+    private void addSystemProperty(List<String> command, String key, String value) {
+        command.add(SYSTEM_PROPERTY_SWITCH + key + EQUALS + value);
+    }
+
+    private void readJarFilesFromDirectory() throws DeploymentException {
+        if (librariesPath == null) {
+            return;
+        }
+        File lib = new File(librariesPath);
+        if (!lib.exists() || lib.isFile()) {
+            throw new DeploymentException("Cannot read files from " + librariesPath);
+        }
+
+        File[] dep = lib.listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".jar");
+            }
+        });
+        classpathDependencies.addAll(Arrays.asList(dep));
+
+    }
+
+    private void addTestResourcesDirectory(Properties properties) throws DeploymentException {
+        String testResources = properties.getProperty("container.test.resources.dir");
+        if (testResources != null) {
+            File testDir = new File(testResources);
+            if (testDir.exists() && testDir.isDirectory()) {
+                classpathDependencies.add(testDir);
+            }
+        }
+    }
+
+    private void logExecutedCommand(List<String> processCommand) {
+        if (LOGGER.isLoggable(Level.FINE)) {
+            StringBuilder builder = new StringBuilder();
+            for (String s : processCommand) {
+                builder.append(s);
+                builder.append(" ");
+            }
+            LOGGER.log(Level.FINE, "Executing command: " + builder);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/SEContainerAppender.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/SEContainerAppender.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/SEContainerAppender.java
new file mode 100644
index 0000000..795a93a
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/SEContainerAppender.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container;
+
+import org.jboss.arquillian.container.se.api.LaunchServices;
+import org.jboss.arquillian.container.se.server.Main;
+import org.jboss.arquillian.container.test.spi.client.deployment.CachedAuxilliaryArchiveAppender;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+
+public class SEContainerAppender extends CachedAuxilliaryArchiveAppender {
+
+    @Override
+    protected Archive<?> buildArchive() {
+        return ShrinkWrap.create(JavaArchive.class, "arquillian-container-se.jar")
+                .addPackage(Main.class.getPackage())
+                .addClass(LaunchServices.class)
+                .addPackage("org.jboss.arquillian.protocol.jmx");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/CustomJMXProtocol.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/CustomJMXProtocol.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/CustomJMXProtocol.java
new file mode 100644
index 0000000..72066c1
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/CustomJMXProtocol.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container.jmx;
+
+import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentPackager;
+import org.jboss.arquillian.protocol.jmx.AbstractJMXProtocol;
+
+public class CustomJMXProtocol extends AbstractJMXProtocol {
+
+    public static final String NAME = "simple-jmx";
+
+    @Override
+    public String getProtocolName() {
+        return NAME;
+    }
+
+    @Override
+    public DeploymentPackager getPackager() {
+        return new TestDeploymentPackager();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/TestDeploymentPackager.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/TestDeploymentPackager.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/TestDeploymentPackager.java
new file mode 100644
index 0000000..1bca3e9
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/jmx/TestDeploymentPackager.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container.jmx;
+
+import java.util.Collection;
+
+import org.jboss.arquillian.container.se.api.ClassPath;
+import org.jboss.arquillian.container.test.spi.TestDeployment;
+import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentPackager;
+import org.jboss.arquillian.container.test.spi.client.deployment.ProtocolArchiveProcessor;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.exporter.ZipExporter;
+
+public class TestDeploymentPackager implements DeploymentPackager {
+
+    @Override
+    public Archive<?> generateDeployment(TestDeployment testDeployment, Collection<ProtocolArchiveProcessor> collection) {
+        Archive<?> applicationArchive = testDeployment.getApplicationArchive();
+        boolean isClassPath = ClassPath.isRepresentedBy(applicationArchive);
+        for (Archive<?> auxiliaryArchive : testDeployment.getAuxiliaryArchives()) {
+            if (isClassPath) {
+                applicationArchive.add(auxiliaryArchive, ClassPath.ROOT_ARCHIVE_PATH, ZipExporter.class);
+            } else {
+                applicationArchive.merge(auxiliaryArchive);
+            }
+        }
+        return applicationArchive;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/Await.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/Await.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/Await.java
new file mode 100644
index 0000000..c9a2173
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/Await.java
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container.util;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+public class Await {
+
+    private static final long DEFAULT_SLEEP_INTERVAL = 100L;
+
+    private final long delay;
+
+    private final long sleepInterval;
+
+    private final Callable<Boolean> condition;
+
+    /**
+     *
+     * @param delay
+     * @param condition
+     */
+    public Await(long delay, Callable<Boolean> condition) {
+        this(DEFAULT_SLEEP_INTERVAL, delay, condition);
+    }
+
+    /**
+     *
+     * @param delay The delay in seconds
+     * @param sleepInterval Thread sleep interval in ms
+     * @param condition
+     */
+    public Await(long sleepInterval, long delay, Callable<Boolean> condition) {
+        this.delay = TimeUnit.SECONDS.toMillis(delay);
+        this.sleepInterval = sleepInterval;
+        this.condition = condition;
+    }
+
+    public boolean start() {
+        long start = System.currentTimeMillis();
+        do {
+            try {
+                if (condition.call()) {
+                    return true;
+                }
+            } catch (Exception ignored) {
+            }
+            try {
+                Thread.sleep(sleepInterval);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                return false;
+            }
+        } while (!isTimeoutExpired(start));
+        return false;
+    }
+
+    private boolean isTimeoutExpired(long start) {
+        return (System.currentTimeMillis() - start) >= delay;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/FileDeploymentUtils.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/FileDeploymentUtils.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/FileDeploymentUtils.java
new file mode 100644
index 0000000..d84541b
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/arquillian/container/util/FileDeploymentUtils.java
@@ -0,0 +1,119 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.itest.springboot.arquillian.container.util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+
+import org.jboss.arquillian.container.se.api.ClassPathDirectory;
+import org.jboss.arquillian.container.spi.client.container.DeploymentException;
+import org.jboss.shrinkwrap.api.Node;
+import org.jboss.shrinkwrap.api.asset.ClassAsset;
+
+public final class FileDeploymentUtils {
+
+    private static final char DELIMITER_RESOURCE_PATH = '/';
+    private static final char DELIMITER_CLASS_NAME_PATH = '.';
+    private static final String EXTENSION_CLASS = ".class";
+
+    private FileDeploymentUtils() {
+    }
+
+    public static void materializeClass(File entryDirectory, ClassAsset classAsset) throws DeploymentException, IOException {
+        File classDirectory;
+        if (classAsset.getSource().getPackage() != null) {
+            classDirectory = new File(entryDirectory, classAsset.getSource().getPackage().getName().replace(DELIMITER_CLASS_NAME_PATH, File.separatorChar));
+            if (!classDirectory.mkdirs()) {
+                throw new DeploymentException("Could not create class package directory: " + classDirectory);
+            }
+        } else {
+            classDirectory = entryDirectory;
+        }
+        File classFile = new File(classDirectory, classAsset.getSource().getSimpleName().concat(EXTENSION_CLASS));
+        classFile.createNewFile();
+        try (InputStream in = classAsset.openStream(); OutputStream out = new FileOutputStream(classFile)) {
+            copy(in, out);
+        }
+    }
+
+    public static void materializeSubdirectories(File entryDirectory, Node node) throws DeploymentException, IOException {
+        for (Node child : node.getChildren()) {
+            if (child.getAsset() == null) {
+                materializeSubdirectories(entryDirectory, child);
+            } else {
+                if (ClassPathDirectory.isMarkerFileArchivePath(child.getPath())) {
+                    // Do not materialize the marker file
+                    continue;
+                }
+                // E.g. META-INF/my-super-descriptor.xml
+                File resourceFile = new File(entryDirectory, child.getPath().get().replace(DELIMITER_RESOURCE_PATH, File.separatorChar));
+                File resoureDirectory = resourceFile.getParentFile();
+                if (!resoureDirectory.exists() && !resoureDirectory.mkdirs()) {
+                    throw new DeploymentException("Could not create class path directory: " + entryDirectory);
+                }
+                resourceFile.createNewFile();
+                try (InputStream in = child.getAsset().openStream(); OutputStream out = new FileOutputStream(resourceFile)) {
+                    copy(in, out);
+                }
+                child.getPath().get();
+            }
+        }
+    }
+
+    public static void copy(InputStream in, OutputStream out) throws IOException {
+        final byte[] buffer = new byte[8192];
+        int n = 0;
+        while (-1 != (n = in.read(buffer))) {
+            out.write(buffer, 0, n);
+        }
+        out.flush();
+    }
+
+    public static void deleteRecursively(Path directory) throws IOException {
+        Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                Files.delete(file);
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                Files.delete(dir);
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    public static void deleteContent(Path directory) throws IOException {
+        Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                Files.delete(file);
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/20401a38/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/util/ArquillianPackager.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/util/ArquillianPackager.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/util/ArquillianPackager.java
index 7293812..071b496 100644
--- a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/util/ArquillianPackager.java
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/util/ArquillianPackager.java
@@ -41,11 +41,13 @@ import org.jboss.shrinkwrap.api.Configuration;
 import org.jboss.shrinkwrap.api.ConfigurationBuilder;
 import org.jboss.shrinkwrap.api.Domain;
 import org.jboss.shrinkwrap.api.ExtensionLoader;
+import org.jboss.shrinkwrap.api.GenericArchive;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.FileAsset;
 import org.jboss.shrinkwrap.api.exporter.ZipExporter;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.jboss.shrinkwrap.impl.base.ServiceExtensionLoader;
+import org.jboss.shrinkwrap.resolver.api.maven.ConfigurableMavenResolverSystem;
 import org.jboss.shrinkwrap.resolver.api.maven.Maven;
 import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact;
 import org.jboss.shrinkwrap.resolver.api.maven.PackagingType;
@@ -85,19 +87,23 @@ public final class ArquillianPackager {
         ark = ark.addAsManifestResource("BOOT-MANIFEST.MF", "MANIFEST.MF");
         ark = ark.addAsResource("spring-boot-itest.properties");
 
+        if (config.getUseCustomLog()) {
+            ark = ark.addAsResource("spring-logback.xml");
+        }
+
         for (Map.Entry<String, String> res : config.getResources().entrySet()) {
             ark = ark.addAsResource(res.getKey(), res.getValue());
         }
 
         ark = ark.addAsDirectories("/lib");
 
-        String version = System.getProperty("itestComponentVersion");
+        String version = System.getProperty("version_org.apache.camel:camel-core");
         if (version == null) {
             config.getMavenVersion();
         }
         if (version == null) {
             // It is missing when launching from IDE
-            List<MavenResolvedArtifact> resolved = Arrays.asList(Maven.resolver().loadPomFromFile("pom.xml").importRuntimeDependencies().resolve().withTransitivity().asResolvedArtifact());
+            List<MavenResolvedArtifact> resolved = Arrays.asList(resolver(config).loadPomFromFile("pom.xml").importRuntimeDependencies().resolve().withoutTransitivity().asResolvedArtifact());
             for (MavenResolvedArtifact dep : resolved) {
                 if (dep.getCoordinate().getGroupId().equals("org.apache.camel")) {
                     version = dep.getCoordinate().getVersion();
@@ -111,14 +117,25 @@ public final class ArquillianPackager {
             throw new IllegalStateException("Cannot determine the current version of the camel component");
         }
 
-        MavenDependencyExclusion[] loggingHellExclusions = new MavenDependencyExclusion[]{MavenDependencies.createExclusion("org.slf4j", "slf4j-log4j12"), MavenDependencies.createExclusion("log4j",
-                "log4j"), MavenDependencies.createExclusion("org.slf4j", "slf4j-simple")};
+        List<MavenDependencyExclusion> commonExclusions = new LinkedList<>();
+        commonExclusions.add(MavenDependencies.createExclusion("org.slf4j", "slf4j-log4j12"));
+        commonExclusions.add(MavenDependencies.createExclusion("log4j", "log4j"));
+        commonExclusions.add(MavenDependencies.createExclusion("org.slf4j", "slf4j-simple"));
+        commonExclusions.add(MavenDependencies.createExclusion("org.slf4j", "slf4j-simple"));
+        commonExclusions.add(MavenDependencies.createExclusion("org.slf4j", "slf4j-jdk14"));
+
+        for (String ex : config.getMavenExclusions()) {
+            commonExclusions.add(MavenDependencies.createExclusion(ex));
+        }
+
+        MavenDependencyExclusion[] commonExclutionArray = commonExclusions.toArray(new MavenDependencyExclusion[]{});
+
 
         // Module dependencies
         List<MavenDependency> moduleDependencies = new LinkedList<>();
 
         MavenCoordinate mainJar = MavenCoordinates.createCoordinate(config.getMavenGroup(), config.getModuleName(), version, PackagingType.JAR, null);
-        MavenDependency mainDep = MavenDependencies.createDependency(mainJar, ScopeType.COMPILE, false, loggingHellExclusions);
+        MavenDependency mainDep = MavenDependencies.createDependency(mainJar, ScopeType.COMPILE, false, commonExclutionArray);
         moduleDependencies.add(mainDep);
 
         for (String canonicalForm : config.getAdditionalDependencies()) {
@@ -137,8 +154,8 @@ public final class ArquillianPackager {
                 scopes.add(ScopeType.PROVIDED);
             }
 
-            List<MavenResolvedArtifact> moduleArtifacts = Arrays.asList(Maven.resolver()
-                    .loadPomFromFile(config.getModulesPath() + config.getModuleName() + "/pom.xml")
+            List<MavenResolvedArtifact> moduleArtifacts = Arrays.asList(resolver(config)
+                    .loadPomFromFile(config.getModuleBasePath() + "/pom.xml")
                     .importDependencies(scopes.toArray(new ScopeType[]{}))
                     .resolve().withoutTransitivity().asResolvedArtifact());
 
@@ -148,13 +165,13 @@ public final class ArquillianPackager {
                 if (!validTestDependency(c)) {
                     continue;
                 }
-                MavenDependency dep = MavenDependencies.createDependency(c, ScopeType.RUNTIME, false, loggingHellExclusions);
+                MavenDependency dep = MavenDependencies.createDependency(c, ScopeType.RUNTIME, false, commonExclutionArray);
                 moduleDependencies.add(dep);
             }
         }
 
         List<File> dependencies = new LinkedList<>();
-        dependencies.addAll(Arrays.asList(Maven.resolver()
+        dependencies.addAll(Arrays.asList(resolver(config)
                 .loadPomFromFile("pom.xml")
                 .importRuntimeDependencies()
                 .addDependencies(moduleDependencies)
@@ -163,23 +180,58 @@ public final class ArquillianPackager {
                 .asFile()));
 
 
+        boolean needsSpringTest = excludeDependencyRegex(dependencies, "^camel-test-spring3-.*");
+        if (needsSpringTest) {
+            // Adding spring4 version of the test library
+            MavenDependency dep = MavenDependencies.createDependency("org.apache.camel:camel-test-spring:" + version, ScopeType.RUNTIME, false);
+
+            dependencies = new LinkedList<>();
+            dependencies.addAll(Arrays.asList(resolver(config)
+                    .loadPomFromFile("pom.xml")
+                    .importRuntimeDependencies()
+                    .addDependencies(moduleDependencies)
+                    .addDependencies(dep)
+                    .resolve()
+                    .withTransitivity()
+                    .asFile()));
+        }
+
         // The spring boot-loader dependency will be added to the main jar, so it should be excluded from the embedded ones
         excludeDependencyRegex(dependencies, "^spring-boot-loader-[0-9].*");
+        excludeDependencyRegex(dependencies, "^camel-test-spring3-.*");
+
 
         // Add all dependencies as spring-boot nested jars
         ark = addDependencies(ark, dependencies);
 
-        if (config.getUnitTestEnabled()) {
-            // Add unit test classes of the module under test
-            ark = addTestResources(ark, config);
-        }
-
         // Add common packages to main jar
         ark = ark.addPackages(true, "org.apache.camel.itest.springboot");
         ark = ark.addPackages(true, "org.springframework.boot.loader");
         ark = ark.addPackages(true, "org.jboss.shrinkwrap");
 
-        return ClassPath.builder().add(ark).build();
+        ark = ark.addPackages(true, "org.apache.camel.converter.myconverter"); // to overcome CAMEL-10060
+        ark = ark.addPackages(true, "org.apache.camel.osgi.test"); // to overcome CAMEL-10060
+
+        ClassPath.Builder external = ClassPath.builder().add(ark);
+
+        // overcome limitations of some JDKs
+        external.addSystemProperty("javax.xml.accessExternalDTD", "all");
+        external.addSystemProperty("javax.xml.accessExternalSchema", "all");
+
+        if (config.getUnitTestEnabled()) {
+            external.addSystemProperty("container.user.dir", new File(config.getModuleBasePath()).getCanonicalPath());
+            external.addSystemProperty("container.test.resources.dir", new File(config.getModuleBasePath()).getCanonicalPath() + "/target/test-classes");
+        }
+
+        for (Map.Entry<String, String> e : config.getSystemProperties().entrySet()) {
+            external.addSystemProperty(e.getKey(), e.getValue());
+        }
+
+        return external.build();
+    }
+
+    private static ConfigurableMavenResolverSystem resolver(ITestConfig config) {
+        return Maven.configureResolver().workOffline(config.getMavenOfflineResolution());
     }
 
     public static void copyResource(String folder, String fileNameRegex, String targetFolder) throws IOException {
@@ -217,7 +269,7 @@ public final class ArquillianPackager {
 
     private static boolean validTestDependency(MavenCoordinate coordinate) {
 
-        Pattern[] patterns = new Pattern[]{Pattern.compile("^log4j$"), Pattern.compile("^slf4j-log4j12$"), Pattern.compile("^slf4j-simple")};
+        Pattern[] patterns = new Pattern[]{Pattern.compile("^log4j$"), Pattern.compile("^slf4j-log4j12$"), Pattern.compile("^slf4j-simple$"), Pattern.compile("^slf4j-jdk14$")};
 
         boolean valid = true;
         for (Pattern p : patterns) {
@@ -234,15 +286,18 @@ public final class ArquillianPackager {
         return valid;
     }
 
-    private static void excludeDependencyRegex(List<File> dependencies, String regex) {
+    private static boolean excludeDependencyRegex(List<File> dependencies, String regex) {
         Pattern pattern = Pattern.compile(regex);
+        int count = 0;
         for (Iterator<File> it = dependencies.iterator(); it.hasNext();) {
             File f = it.next();
             if (pattern.matcher(f.getName()).matches()) {
                 it.remove();
+                count++;
                 break;
             }
         }
+        return count > 0;
     }
 
     private static JavaArchive addDependencies(JavaArchive ark, Collection<File> deps) {
@@ -255,8 +310,9 @@ public final class ArquillianPackager {
         return ark;
     }
 
-    private static JavaArchive addTestResources(JavaArchive ark, ITestConfig config) throws IOException {
-        File test = new File(config.getModulesPath() + config.getModuleName() + "/target/test-classes/");
+    private static JavaArchive addTestClasses(JavaArchive mainArk, Domain domain, ITestConfig config) throws IOException {
+
+        File test = new File(config.getModuleBasePath() + "/target/test-classes/");
         File[] fs = test.listFiles();
         if (fs == null) {
             fs = new File[]{};
@@ -266,9 +322,11 @@ public final class ArquillianPackager {
             File f = testFiles.pop();
             String relative = test.getCanonicalFile().toURI().relativize(f.getCanonicalFile().toURI()).getPath();
             if (f.isFile()) {
-                ark = ark.addAsResource(f, relative);
+                if (f.getName().endsWith(".class")) {
+                    mainArk = mainArk.addAsResource(f, relative);
+                }
             } else {
-                ark = ark.addAsDirectory(relative);
+                mainArk = mainArk.addAsDirectory(relative);
                 File[] files = f.listFiles();
                 if (files == null) {
                     files = new File[]{};
@@ -277,6 +335,33 @@ public final class ArquillianPackager {
             }
         }
 
+        return mainArk;
+    }
+
+    private static GenericArchive addSources(GenericArchive ark, ITestConfig config) throws IOException {
+        File sources = new File(config.getModuleBasePath() + "/src/");
+        ark.addAsDirectory("src");
+
+        File[] fs = sources.listFiles();
+        if (fs == null) {
+            fs = new File[]{};
+        }
+        LinkedList<File> sourceFiles = new LinkedList<>(Arrays.asList(fs));
+        while (!sourceFiles.isEmpty()) {
+            File f = sourceFiles.pop();
+            String relative = sources.getParentFile().getCanonicalFile().toURI().relativize(f.getCanonicalFile().toURI()).getPath();
+            if (f.isFile()) {
+                ark.add(new FileAsset(f), relative);
+            } else {
+                ark = ark.addAsDirectory(relative);
+                File[] files = f.listFiles();
+                if (files == null) {
+                    files = new File[]{};
+                }
+                sourceFiles.addAll(Arrays.asList(files));
+            }
+        }
+
         return ark;
     }