This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1be5a9370a96f32f072e0baf12dbe960d0f0ecf9
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Fri Apr 24 12:05:25 2020 +0700

    JAMES-3140 Choosing blob store should be done via configured modules
    
    This makes guice modules composition staticaly defined before starting
    James
---
 .../CassandraRabbitMQAwsS3SmtpTestRuleFactory.java |  26 ++-
 .../mpt/smtp/CassandraSmtpTestRuleFactory.java     |   4 +-
 .../ObjectStorageBlobStoreModule.java              |  39 ----
 .../ObjectStorageDependenciesModule.java           |   8 +-
 .../swift/ObjectStorageBlobStoreModuleTest.java    |  14 +-
 .../org/apache/james/CassandraJamesServerMain.java |  11 +-
 ...onModule.java => CassandraBlobStoreModule.java} |   2 +-
 .../apache/james/CassandraLdapJamesServerMain.java |   7 +-
 .../james/CassandraRabbitMQJamesServerMain.java    |  27 ++-
 .../modules/blobstore/BlobStoreChoosingModule.java |  49 -----
 ...figuration.java => BlobStoreConfiguration.java} |  50 +++--
 .../modules/blobstore/BlobStoreModulesChooser.java | 114 +++++++++++
 .../james/CassandraRabbitMQAwsS3JmapTestRule.java  |   6 +-
 .../james/CassandraRabbitMQJamesServerFixture.java |   3 +-
 .../james/CassandraRabbitMQSwiftJmapTestRule.java  |   7 +-
 .../james/RabbitMQJamesServerReprocessingTest.java |   5 +-
 ...RabbitMQJamesServerWithRetryConnectionTest.java |   2 +
 .../org/apache/james/WithCassandraBlobStore.java   |  15 +-
 .../james/modules/AwsS3BlobStoreExtension.java     |   6 +-
 .../james/modules/SwiftBlobStoreExtension.java     |   6 +-
 .../james/modules/TestAwsS3BlobStoreModule.java    |  47 -----
 .../james/modules/TestSwiftBlobStoreModule.java    |  46 -----
 .../blobstore/BlobStoreChoosingModuleTest.java     | 211 ---------------------
 ...onTest.java => BlobStoreConfigurationTest.java} | 108 +++++++++--
 .../blobstore/BlobStoreModulesChooserTest.java     | 105 ++++++++++
 .../CassandraRabbitMQLdapJamesServerMain.java      |  21 +-
 .../CassandraRabbitMQLdapJmapJamesServerTest.java  |  18 +-
 .../java/org/apache/james/JamesServerMain.java     |   8 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |   7 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |   7 +-
 .../org/apache/james/MemoryJamesServerMain.java    |  10 +-
 .../rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java   |   3 +-
 .../RabbitMQAwsS3SpamAssassinContractTest.java     |   3 +-
 .../cucumber/awss3/RabbitMQAwsS3Stepdefs.java      |   3 +-
 .../rabbitmq/ConsistencyTasksIntegrationTest.java  |   5 +-
 .../rabbitmq/FixingGhostMailboxTest.java           |   3 +-
 .../rabbitmq/RabbitMQAuthorizedEndpointsTest.java  |   3 +-
 .../RabbitMQEventDeadLettersIntegrationTest.java   |   3 +-
 ...stViewProjectionHealthCheckIntegrationTest.java |   3 +-
 .../rabbitmq/RabbitMQForwardIntegrationTest.java   |   3 +-
 .../rabbitmq/RabbitMQJmapExtension.java            |   3 +-
 .../rabbitmq/RabbitMQJwtFilterIntegrationTest.java |   3 +-
 ...RabbitMQReindexingWithEventDeadLettersTest.java |   3 +-
 .../RabbitMQWebAdminServerIntegrationTest.java     |   3 +-
 ...dminServerTaskSerializationIntegrationTest.java |   3 +-
 ...RabbitMQDeletedMessageVaultIntegrationTest.java |   3 +-
 ...LinshareBlobExportMechanismIntegrationTest.java |   3 +-
 47 files changed, 534 insertions(+), 505 deletions(-)

diff --git 
a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
 
b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
index 01c82b4..6ccde46 100644
--- 
a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
+++ 
b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
@@ -25,11 +25,13 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.DockerCassandra;
 import 
org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.backends.rabbitmq.DockerRabbitMQSingleton;
+import org.apache.james.blob.api.BlobStore;
+import org.apache.james.blob.api.MetricableBlobStore;
+import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.modules.TestAwsS3BlobStoreModule;
 import org.apache.james.modules.TestRabbitMQModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
+import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import 
org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
@@ -40,6 +42,10 @@ import 
org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.util.Host;
 import org.junit.rules.TemporaryFolder;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.name.Names;
+
 public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
     public static SmtpTestRule create(SmtpServerConnectedType 
smtpServerConnectedType, Host cassandraHost, DockerAwsS3TestRule awsS3TestRule) 
{
         SmtpTestRule.ServerBuilder createJamesServer = (folder, dnsService) -> 
createJamesServer(cassandraHost, awsS3TestRule, folder, dnsService);
@@ -47,6 +53,16 @@ public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory 
{
         return new SmtpTestRule(smtpServerConnectedType, createJamesServer);
     }
 
+    private static Module BLOB_STORE_MODULE = new AbstractModule() {
+        @Override
+        protected void configure() {
+            install(new ObjectStorageDependenciesModule());
+            bind(BlobStore.class)
+                
.annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
+                .to(ObjectStorageBlobStore.class);
+        }
+    };
+
     private static GuiceJamesServer createJamesServer(Host cassandraHost, 
DockerAwsS3TestRule awsS3TestRule, TemporaryFolder folder, DNSService 
dnsService) throws Exception {
         Configuration configuration = Configuration.builder()
             .workingDirectory(folder.newFolder())
@@ -59,12 +75,10 @@ public final class 
CassandraRabbitMQAwsS3SmtpTestRuleFactory {
                 binder -> 
binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> 
binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
                     .toInstance(BaseHierarchicalConfiguration::new))
-            .overrideWith(
-                new RabbitMQModule(),
-                new BlobStoreChoosingModule())
+            .overrideWith(new RabbitMQModule(), BLOB_STORE_MODULE)
             .overrideWith(
                 new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON),
-                new TestAwsS3BlobStoreModule(awsS3TestRule),
+                awsS3TestRule.getModule(),
                 binder -> binder.bind(KeyspacesConfiguration.class)
                     .toInstance(KeyspacesConfiguration.builder()
                         .keyspace(DockerCassandra.KEYSPACE)
diff --git 
a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
 
b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
index dfec67e..97b73de 100644
--- 
a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
+++ 
b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
@@ -24,7 +24,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.DockerCassandra;
 import 
org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.modules.mailbox.CassandraBlobStoreDeclarationModule;
+import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
 import 
org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.server.CamelMailetContainerModule;
@@ -49,7 +49,7 @@ public final class CassandraSmtpTestRuleFactory {
 
         return GuiceJamesServer.forConfiguration(configuration)
             .combineWith(CassandraJamesServerMain.CASSANDRA_SERVER_CORE_MODULE,
-                new CassandraBlobStoreDeclarationModule(),
+                new CassandraBlobStoreModule(),
                 SmtpTestRule.SMTP_PROTOCOL_MODULE,
                 binder -> 
binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> 
binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java
 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java
deleted file mode 100644
index 5440878..0000000
--- 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java
+++ /dev/null
@@ -1,39 +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.james.modules.objectstorage;
-
-import org.apache.james.blob.api.BlobStore;
-import org.apache.james.blob.api.MetricableBlobStore;
-import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.name.Names;
-
-public class ObjectStorageBlobStoreModule extends AbstractModule {
-
-    @Override
-    protected void configure() {
-        install(new ObjectStorageDependenciesModule());
-        bind(BlobStore.class)
-            
.annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
-            .to(ObjectStorageBlobStore.class);
-    }
-
-}
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
index 7ccbb9a..a56388b 100644
--- 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
+++ 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
@@ -28,7 +28,6 @@ import javax.inject.Singleton;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.blob.api.BlobId;
-import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.objectstorage.BlobPutter;
 import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.blob.objectstorage.ObjectStorageBlobStoreBuilder;
@@ -40,13 +39,12 @@ import org.apache.james.utils.PropertiesProvider;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
-import com.google.inject.Scopes;
 
 public class ObjectStorageDependenciesModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        
bind(BlobId.Factory.class).to(HashBlobId.Factory.class).in(Scopes.SINGLETON);
+
     }
 
     @Provides
@@ -66,7 +64,7 @@ public class ObjectStorageDependenciesModule extends 
AbstractModule {
         ObjectStorageBlobStore blobStore = 
selectBlobStoreBuilder(configuration)
             .blobIdFactory(blobIdFactory)
             .payloadCodec(configuration.getPayloadCodec())
-            .blobPutter(putBlob(blobIdFactory, configuration, 
awsS3ObjectStorageProvider))
+            .blobPutter(putBlob(configuration, awsS3ObjectStorageProvider))
             .namespace(configuration.getNamespace())
             .bucketPrefix(configuration.getBucketPrefix())
             .build();
@@ -83,7 +81,7 @@ public class ObjectStorageDependenciesModule extends 
AbstractModule {
         throw new IllegalArgumentException("unknown provider " + 
configuration.getProvider());
     }
 
-    private Optional<BlobPutter> putBlob(BlobId.Factory blobIdFactory, 
ObjectStorageBlobConfiguration configuration, Provider<AwsS3ObjectStorage> 
awsS3ObjectStorageProvider) {
+    private Optional<BlobPutter> putBlob(ObjectStorageBlobConfiguration 
configuration, Provider<AwsS3ObjectStorage> awsS3ObjectStorageProvider) {
         switch (configuration.getProvider()) {
             case SWIFT:
                 return Optional.empty();
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
index 05a386a..fbd6d63 100644
--- 
a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
+++ 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
@@ -26,11 +26,13 @@ import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Stream;
 
+import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.blob.api.MetricableBlobStore;
+import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.objectstorage.DockerSwift;
 import org.apache.james.blob.objectstorage.DockerSwiftExtension;
+import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.blob.objectstorage.swift.Credentials;
 import org.apache.james.blob.objectstorage.swift.DomainName;
 import org.apache.james.blob.objectstorage.swift.IdentityV3;
@@ -44,7 +46,7 @@ import org.apache.james.blob.objectstorage.swift.TenantName;
 import org.apache.james.blob.objectstorage.swift.UserHeaderName;
 import org.apache.james.blob.objectstorage.swift.UserName;
 import org.apache.james.modules.objectstorage.ObjectStorageBlobConfiguration;
-import org.apache.james.modules.objectstorage.ObjectStorageBlobStoreModule;
+import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
 import org.apache.james.modules.objectstorage.ObjectStorageProvider;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.junit.jupiter.api.BeforeAll;
@@ -57,8 +59,6 @@ import org.junit.jupiter.params.provider.ArgumentsSource;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.name.Names;
 import com.google.inject.util.Modules;
 
 @ExtendWith(DockerSwiftExtension.class)
@@ -132,11 +132,11 @@ class ObjectStorageBlobStoreModuleTest {
     @ArgumentsSource(BlobStorageBlobConfigurationProvider.class)
     void shouldSetupBlobStore(ObjectStorageBlobConfiguration configuration) {
         Injector injector = Guice.createInjector(
-            Modules
-                .override(new ObjectStorageBlobStoreModule())
+            Modules.override(binder -> 
binder.bind(BlobId.Factory.class).to(HashBlobId.Factory.class),
+                    new ObjectStorageDependenciesModule())
                 .with(binder -> 
binder.bind(ObjectStorageBlobConfiguration.class).toInstance(configuration)));
 
-        BlobStore blobStore = injector.getInstance(Key.get(BlobStore.class, 
Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION)));
+        BlobStore blobStore = 
injector.getInstance(ObjectStorageBlobStore.class);
 
         assertThatCode(() -> blobStore.save(blobStore.getDefaultBucketName(), 
new byte[] {0x00}, LOW_COST)).doesNotThrowAnyException();
     }
diff --git 
a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
 
b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 440828e..a28abc2 100644
--- 
a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ 
b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -35,8 +35,8 @@ import 
org.apache.james.modules.data.CassandraSieveRepositoryModule;
 import org.apache.james.modules.data.CassandraUsersRepositoryModule;
 import org.apache.james.modules.eventstore.CassandraEventStoreModule;
 import org.apache.james.modules.mailbox.BlobStoreAPIModule;
-import org.apache.james.modules.mailbox.CassandraBlobStoreDeclarationModule;
 import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
+import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
 import org.apache.james.modules.mailbox.CassandraQuotaMailingModule;
@@ -73,6 +73,7 @@ import 
org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
 import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
 import org.apache.james.modules.webadmin.CassandraRoutesModule;
 import org.apache.james.modules.webadmin.InconsistencySolvingRoutesModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
@@ -155,14 +156,18 @@ public class CassandraJamesServerMain implements 
JamesServerMain {
         new DKIMMailetModule());
 
     public static Module ALL_BUT_JMX_CASSANDRA_MODULE = Modules.combine(
-        new CassandraBlobStoreDeclarationModule(),
+        new CassandraBlobStoreModule(),
         REQUIRE_TASK_MANAGER_MODULE,
         new TaskManagerModule(),
         CASSANDRA_EVENT_STORE_JSON_SERIALIZATION_DEFAULT_MODULE
     );
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(ALL_BUT_JMX_CASSANDRA_MODULE, new 
JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, ALL_BUT_JMX_CASSANDRA_MODULE, new 
JMXServerModule());
     }
 
 }
diff --git 
a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
 
b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
similarity index 95%
rename from 
server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
rename to 
server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
index e885e15..b4b3dca 100644
--- 
a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
+++ 
b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
@@ -26,7 +26,7 @@ import org.apache.james.blob.cassandra.CassandraBlobStore;
 import com.google.inject.AbstractModule;
 import com.google.inject.name.Names;
 
-public class CassandraBlobStoreDeclarationModule extends AbstractModule {
+public class CassandraBlobStoreModule extends AbstractModule {
     @Override
     protected void configure() {
         bind(BlobStore.class)
diff --git 
a/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
 
b/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
index cf02e66..345c725 100644
--- 
a/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
+++ 
b/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
@@ -23,6 +23,7 @@ import static 
org.apache.james.CassandraJamesServerMain.ALL_BUT_JMX_CASSANDRA_MO
 
 import org.apache.james.data.LdapUsersRepositoryModule;
 import org.apache.james.modules.server.JMXServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
@@ -33,7 +34,11 @@ public class CassandraLdapJamesServerMain implements 
JamesServerMain {
         .with(new LdapUsersRepositoryModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(MODULES, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, MODULES, new JMXServerModule());
     }
 
 }
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index bd5a425..d78ebaa 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -23,21 +23,40 @@ import static 
org.apache.james.CassandraJamesServerMain.REQUIRE_TASK_MANAGER_MOD
 
 import org.apache.james.modules.DistributedTaskManagerModule;
 import org.apache.james.modules.TaskSerializationModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.event.RabbitMQEventBusModule;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
 import org.apache.james.modules.server.JMXServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
 public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
-    public static final Module MODULES =
+    protected static final Module MODULES =
         Modules
             .override(Modules.combine(REQUIRE_TASK_MANAGER_MODULE, new 
DistributedTaskManagerModule()))
-            .with(new RabbitMQModule(), new BlobStoreChoosingModule(), new 
RabbitMQEventBusModule(), new TaskSerializationModule());
+            .with(new RabbitMQModule(), new RabbitMQEventBusModule(), new 
TaskSerializationModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(MODULES, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        BlobStoreConfiguration blobStoreConfiguration = 
BlobStoreConfiguration.parse(configuration);
+
+        Module baseModule = modules(blobStoreConfiguration);
+
+        JamesServerMain.main(configuration,
+            baseModule, new JMXServerModule());
+    }
+
+    public static Module modules(BlobStoreConfiguration 
blobStoreConfiguration) {
+        return Modules.combine(ImmutableList.<Module>builder()
+                .add(MODULES)
+                
.addAll(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
+                .build());
     }
 }
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
index 4e79e50..5b30d21 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
@@ -21,24 +21,16 @@ package org.apache.james.modules.blobstore;
 
 import java.io.FileNotFoundException;
 
-import javax.inject.Named;
-import javax.inject.Provider;
 import javax.inject.Singleton;
 
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.blob.api.BlobStore;
-import org.apache.james.blob.api.MetricableBlobStore;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
-import org.apache.james.blob.cassandra.CassandraBlobStore;
-import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.blob.union.HybridBlobStore;
 import org.apache.james.modules.mailbox.ConfigurationComponent;
 import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
 import org.apache.james.utils.PropertiesProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.AbstractModule;
@@ -46,8 +38,6 @@ import com.google.inject.Provides;
 import com.google.inject.multibindings.Multibinder;
 
 public class BlobStoreChoosingModule extends AbstractModule {
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(BlobStoreChoosingModule.class);
-
     @Override
     protected void configure() {
         install(new ObjectStorageDependenciesModule());
@@ -56,45 +46,6 @@ public class BlobStoreChoosingModule extends AbstractModule {
         
cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
     }
 
-    @VisibleForTesting
-    @Provides
-    @Singleton
-    BlobStoreChoosingConfiguration 
provideChoosingConfiguration(PropertiesProvider propertiesProvider) throws 
ConfigurationException {
-        try {
-            Configuration configuration = 
propertiesProvider.getConfigurations(ConfigurationComponent.NAMES);
-            return BlobStoreChoosingConfiguration.from(configuration);
-        } catch (FileNotFoundException e) {
-            LOGGER.warn("Could not find " + ConfigurationComponent.NAME + " 
configuration file, using cassandra blobstore as the default");
-            return BlobStoreChoosingConfiguration.cassandra();
-        }
-    }
-
-    @VisibleForTesting
-    @Provides
-    @Named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION)
-    @Singleton
-    BlobStore provideBlobStore(BlobStoreChoosingConfiguration 
choosingConfiguration,
-                               Provider<CassandraBlobStore> 
cassandraBlobStoreProvider,
-                               Provider<ObjectStorageBlobStore> 
objectStorageBlobStoreProvider,
-                               HybridBlobStore.Configuration 
hybridBlobStoreConfiguration) {
-
-        switch (choosingConfiguration.getImplementation()) {
-            case OBJECTSTORAGE:
-                return objectStorageBlobStoreProvider.get();
-            case CASSANDRA:
-                return cassandraBlobStoreProvider.get();
-            case HYBRID:
-                return HybridBlobStore.builder()
-                    .lowCost(objectStorageBlobStoreProvider.get())
-                    .highPerformance(cassandraBlobStoreProvider.get())
-                    .configuration(hybridBlobStoreConfiguration)
-                    .build();
-            default:
-                throw new RuntimeException(String.format("can not get the 
right blobstore provider with configuration %s",
-                    choosingConfiguration.toString()));
-        }
-    }
-
     @Provides
     @Singleton
     @VisibleForTesting
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfiguration.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
similarity index 63%
rename from 
server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfiguration.java
rename to 
server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
index 84bc7fb..c7f2325 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfiguration.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
@@ -19,17 +19,25 @@
 
 package org.apache.james.modules.blobstore;
 
+import java.io.FileNotFoundException;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
+import org.apache.james.server.core.filesystem.FileSystemImpl;
+import org.apache.james.utils.PropertiesProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.MoreObjects;
 
-public class BlobStoreChoosingConfiguration {
+public class BlobStoreConfiguration {
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(BlobStoreConfiguration.class);
 
     public enum BlobStoreImplName {
         CASSANDRA("cassandra"),
@@ -63,7 +71,23 @@ public class BlobStoreChoosingConfiguration {
 
     static final String BLOBSTORE_IMPLEMENTATION_PROPERTY = "implementation";
 
-    static BlobStoreChoosingConfiguration from(Configuration configuration) {
+    public static BlobStoreConfiguration 
parse(org.apache.james.server.core.configuration.Configuration configuration) 
throws ConfigurationException {
+        PropertiesProvider propertiesProvider = new PropertiesProvider(new 
FileSystemImpl(configuration.directories()), configuration);
+
+        return parse(propertiesProvider);
+    }
+
+    public static BlobStoreConfiguration parse(PropertiesProvider 
propertiesProvider) throws ConfigurationException {
+        try {
+            Configuration configuration = 
propertiesProvider.getConfigurations(ConfigurationComponent.NAMES);
+            return BlobStoreConfiguration.from(configuration);
+        } catch (FileNotFoundException e) {
+            LOGGER.warn("Could not find " + ConfigurationComponent.NAME + " 
configuration file, using cassandra blobstore as the default");
+            return BlobStoreConfiguration.cassandra();
+        }
+    }
+
+    static BlobStoreConfiguration from(Configuration configuration) {
         BlobStoreImplName blobStoreImplName = 
Optional.ofNullable(configuration.getString(BLOBSTORE_IMPLEMENTATION_PROPERTY))
             .filter(StringUtils::isNotBlank)
             .map(StringUtils::trim)
@@ -71,25 +95,25 @@ public class BlobStoreChoosingConfiguration {
             .orElseThrow(() -> new IllegalStateException(String.format("%s 
property is missing please use one of " +
                 "supported values in: %s", BLOBSTORE_IMPLEMENTATION_PROPERTY, 
BlobStoreImplName.supportedImplNames())));
 
-        return new BlobStoreChoosingConfiguration(blobStoreImplName);
+        return new BlobStoreConfiguration(blobStoreImplName);
     }
 
-    public static BlobStoreChoosingConfiguration cassandra() {
-        return new BlobStoreChoosingConfiguration(BlobStoreImplName.CASSANDRA);
+    public static BlobStoreConfiguration cassandra() {
+        return new BlobStoreConfiguration(BlobStoreImplName.CASSANDRA);
     }
 
-    public static BlobStoreChoosingConfiguration objectStorage() {
-        return new 
BlobStoreChoosingConfiguration(BlobStoreImplName.OBJECTSTORAGE);
+    public static BlobStoreConfiguration objectStorage() {
+        return new BlobStoreConfiguration(BlobStoreImplName.OBJECTSTORAGE);
     }
 
-    public static BlobStoreChoosingConfiguration hybrid() {
-        return new BlobStoreChoosingConfiguration(BlobStoreImplName.HYBRID);
+    public static BlobStoreConfiguration hybrid() {
+        return new BlobStoreConfiguration(BlobStoreImplName.HYBRID);
     }
 
     private final BlobStoreImplName implementation;
 
-    BlobStoreChoosingConfiguration(BlobStoreImplName implementation) {
-        this.implementation = implementation;
+    BlobStoreConfiguration(BlobStoreImplName implementation) {
+       this.implementation = implementation;
     }
 
     BlobStoreImplName getImplementation() {
@@ -98,8 +122,8 @@ public class BlobStoreChoosingConfiguration {
 
     @Override
     public final boolean equals(Object o) {
-        if (o instanceof BlobStoreChoosingConfiguration) {
-            BlobStoreChoosingConfiguration that = 
(BlobStoreChoosingConfiguration) o;
+        if (o instanceof BlobStoreConfiguration) {
+            BlobStoreConfiguration that = (BlobStoreConfiguration) o;
 
             return Objects.equals(this.implementation, that.implementation);
         }
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
new file mode 100644
index 0000000..f1cc709
--- /dev/null
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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.james.modules.blobstore;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ex.ConfigurationException;
+import org.apache.james.blob.api.BlobStore;
+import org.apache.james.blob.api.MetricableBlobStore;
+import org.apache.james.blob.cassandra.CassandraBlobStore;
+import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
+import org.apache.james.blob.union.HybridBlobStore;
+import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
+import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
+import org.apache.james.utils.PropertiesProvider;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.Provides;
+import com.google.inject.name.Names;
+
+public class BlobStoreModulesChooser {
+    static class CassandraDeclarationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            install(new CassandraBlobStoreDependenciesModule());
+            bind(BlobStore.class)
+                
.annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
+                .to(CassandraBlobStore.class);
+        }
+    }
+
+    static class ObjectStorageDeclarationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            install(new ObjectStorageDependenciesModule());
+            bind(BlobStore.class)
+                
.annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
+                .to(ObjectStorageBlobStore.class);
+        }
+    }
+
+    static class HybridDeclarationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            install(new ObjectStorageDependenciesModule());
+            install(new CassandraBlobStoreDependenciesModule());
+        }
+
+        @Provides
+        @Singleton
+        @VisibleForTesting
+        HybridBlobStore.Configuration 
providesHybridBlobStoreConfiguration(PropertiesProvider propertiesProvider) {
+            try {
+                Configuration configuration = 
propertiesProvider.getConfigurations(ConfigurationComponent.NAMES);
+                return HybridBlobStore.Configuration.from(configuration);
+            } catch (FileNotFoundException | ConfigurationException e) {
+                return HybridBlobStore.Configuration.DEFAULT;
+            }
+        }
+
+        @Provides
+        @Named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION)
+        @Singleton
+        BlobStore providesHybridBlobStore(HybridBlobStore.Configuration 
hybridBlobStoreConfiguration,
+                                          CassandraBlobStore 
cassandraBlobStore,
+                                          ObjectStorageBlobStore 
objectStorageBlobStore) {
+            return HybridBlobStore.builder()
+                .lowCost(objectStorageBlobStore)
+                .highPerformance(cassandraBlobStore)
+                .configuration(hybridBlobStoreConfiguration)
+                .build();
+        }
+    }
+
+    @VisibleForTesting
+    public static List<Module> chooseModules(BlobStoreConfiguration 
choosingConfiguration) {
+        switch (choosingConfiguration.getImplementation()) {
+            case CASSANDRA:
+                return ImmutableList.of(new CassandraDeclarationModule());
+            case OBJECTSTORAGE:
+                return ImmutableList.of(new ObjectStorageDeclarationModule());
+            case HYBRID:
+                return ImmutableList.of(new HybridDeclarationModule());
+            default:
+                throw new RuntimeException("Unsuported blobStore 
implementation " + choosingConfiguration.getImplementation());
+        }
+    }
+}
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
index 249f05b..59318aa 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
@@ -27,7 +27,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.webadmin.WebAdminConfiguration;
@@ -68,11 +68,9 @@ public class CassandraRabbitMQAwsS3JmapTestRule implements 
TestRule {
             .build();
 
         return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> 
binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new 
TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
-            .overrideWith(binder -> 
binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new 
TestDockerESMetricReporterModule(dockerElasticSearchRule.getDockerEs().getHttpHost()))
             .overrideWith(guiceModuleTestRule.getModule())
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
index 4984f55..24cd328 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
@@ -22,13 +22,14 @@ package org.apache.james;
 import org.apache.james.jmap.draft.JmapJamesServerContract;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 
 public class CassandraRabbitMQJamesServerFixture {
 
     private static final JamesServerBuilder.ServerProvider 
CONFIGURATION_BUILDER =
         configuration -> GuiceJamesServer
             .forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             
.overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE);
 
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
index 8a0de82..75cde2b 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
@@ -27,7 +27,8 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
-import org.apache.james.modules.TestSwiftBlobStoreModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestRule;
@@ -66,10 +67,10 @@ public class CassandraRabbitMQSwiftJmapTestRule implements 
TestRule {
             .build();
 
         return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> 
binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new 
TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
-            .overrideWith(new TestSwiftBlobStoreModule())
+            .overrideWith(new DockerSwiftTestRule().getModule())
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new 
TestDockerESMetricReporterModule(dockerElasticSearchRule.getDockerEs().getHttpHost()))
             .overrideWith(guiceModuleTestRule.getModule())
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
index f5aa48f..dc992fd 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
@@ -24,9 +24,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.jmap.draft.JmapJamesServerContract;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
@@ -54,9 +55,9 @@ class RabbitMQJamesServerReprocessingTest {
     @RegisterExtension
     JamesServerExtension jamesServerExtension = 
CassandraRabbitMQJamesServerFixture
         .baseExtensionBuilder(rabbitMQExtension)
+        .extension(new AwsS3BlobStoreExtension())
         .server(configuration -> GuiceJamesServer
             .forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(binder -> 
binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION))
             
.overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
index e44138e..da1a615 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
@@ -27,6 +27,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.util.concurrent.NamedThreadFactory;
 import org.junit.jupiter.api.AfterEach;
@@ -43,6 +44,7 @@ class RabbitMQJamesServerWithRetryConnectionTest {
     @RegisterExtension
     JamesServerExtension jamesServerExtension = 
CassandraRabbitMQJamesServerFixture
         .baseExtensionBuilder(rabbitMQExtension)
+        .extension(new AwsS3BlobStoreExtension())
         .disableAutoStart()
         .build();
 
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
index 808c47e..0d996be 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
@@ -19,6 +19,10 @@
 
 package org.apache.james;
 
+import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
@@ -33,7 +37,16 @@ public class WithCassandraBlobStore implements 
BeforeAllCallback, AfterAllCallba
     private final JamesServerExtension jamesServerExtension;
 
     WithCassandraBlobStore() {
-        jamesServerExtension = 
CassandraRabbitMQJamesServerFixture.baseExtensionBuilder().build();
+        jamesServerExtension = new JamesServerBuilder()
+            .extension(new DockerElasticSearchExtension())
+            .extension(new CassandraExtension())
+            .extension(new RabbitMQExtension())
+            .server(configuration -> GuiceJamesServer
+                .forConfiguration(configuration)
+                
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.cassandra()))
+                .overrideWith(TestJMAPServerModule.limitToTenMessages())
+                
.overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
+            .build();
     }
 
     @Override
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
index 6d6ffaf..4b09ce6 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
@@ -21,13 +21,11 @@ package org.apache.james.modules;
 
 import org.apache.james.GuiceModuleTestExtension;
 import org.apache.james.blob.objectstorage.DockerAwsS3Singleton;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
 import com.google.inject.Module;
-import com.google.inject.util.Modules;
 
 public class AwsS3BlobStoreExtension implements GuiceModuleTestExtension {
 
@@ -52,8 +50,6 @@ public class AwsS3BlobStoreExtension implements 
GuiceModuleTestExtension {
 
     @Override
     public Module getModule() {
-        return Modules.override(awsS3TestRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
+        return awsS3TestRule.getModule();
     }
 }
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
index 2aee3f8..3d5fec1 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
@@ -20,13 +20,11 @@
 package org.apache.james.modules;
 
 import org.apache.james.GuiceModuleTestExtension;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
 import com.google.inject.Module;
-import com.google.inject.util.Modules;
 
 public class SwiftBlobStoreExtension implements GuiceModuleTestExtension {
 
@@ -52,8 +50,6 @@ public class SwiftBlobStoreExtension implements 
GuiceModuleTestExtension {
 
     @Override
     public Module getModule() {
-        return Modules.override(swiftRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
+        return swiftRule.getModule();
     }
 }
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java
deleted file mode 100644
index ea9ae97..0000000
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java
+++ /dev/null
@@ -1,47 +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.james.modules;
-
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
-import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.util.Modules;
-
-public class TestAwsS3BlobStoreModule extends AbstractModule {
-
-    private final DockerAwsS3TestRule dockerAwsS3TestRule;
-
-    public TestAwsS3BlobStoreModule(DockerAwsS3TestRule awsS3TestRule) {
-        this.dockerAwsS3TestRule = awsS3TestRule;
-    }
-
-    @Override
-    protected void configure() {
-        Module testAwsS3BlobStoreModule = Modules
-            .override(dockerAwsS3TestRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                    
.toInstance(BlobStoreChoosingConfiguration.objectStorage()));
-
-        install(testAwsS3BlobStoreModule);
-    }
-}
-
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java
deleted file mode 100644
index 4638109..0000000
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java
+++ /dev/null
@@ -1,46 +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.james.modules;
-
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
-import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.util.Modules;
-
-public class TestSwiftBlobStoreModule extends AbstractModule {
-
-    private final DockerSwiftTestRule dockerSwiftTestRule;
-
-    public TestSwiftBlobStoreModule() {
-        this.dockerSwiftTestRule = new DockerSwiftTestRule();
-    }
-
-    @Override
-    protected void configure() {
-        Module testSwiftBlobStoreModule = Modules
-            .override(dockerSwiftTestRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
-
-        install(testSwiftBlobStoreModule);
-    }
-}
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java
deleted file mode 100644
index 810cf50..0000000
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java
+++ /dev/null
@@ -1,211 +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.james.modules.blobstore;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Mockito.mock;
-
-import org.apache.commons.configuration2.PropertiesConfiguration;
-import org.apache.james.FakePropertiesProvider;
-import org.apache.james.blob.cassandra.CassandraBlobStore;
-import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
-import org.apache.james.blob.union.HybridBlobStore;
-import 
org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration.BlobStoreImplName;
-import org.apache.james.modules.mailbox.ConfigurationComponent;
-import org.junit.jupiter.api.Test;
-
-import com.google.inject.Provider;
-
-class BlobStoreChoosingModuleTest {
-
-    private static CassandraBlobStore CASSANDRA_BLOBSTORE = 
mock(CassandraBlobStore.class);
-    private static Provider<CassandraBlobStore> CASSANDRA_BLOBSTORE_PROVIDER = 
() -> CASSANDRA_BLOBSTORE;
-    private static ObjectStorageBlobStore OBJECT_STORAGE_BLOBSTORE = 
mock(ObjectStorageBlobStore.class);
-    private static Provider<ObjectStorageBlobStore> 
OBJECT_STORAGE_BLOBSTORE_PROVIDER = () -> OBJECT_STORAGE_BLOBSTORE;
-
-    @Test
-    void provideChoosingConfigurationShouldThrowWhenMissingPropertyField() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", "");
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> 
module.provideChoosingConfiguration(propertyProvider))
-            .isInstanceOf(IllegalStateException.class);
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldThrowWhenEmptyPropertyField() 
throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", "");
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> 
module.provideChoosingConfiguration(propertyProvider))
-            .isInstanceOf(IllegalStateException.class);
-    }
-
-    @Test
-    void 
provideChoosingConfigurationShouldThrowWhenPropertyFieldIsNotInSupportedList() 
throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", "gabouzomeuh");
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> 
module.provideChoosingConfiguration(propertyProvider))
-            .isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldReturnCassandraWhenNoFile() throws 
Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register("other_configuration_file", new 
PropertiesConfiguration())
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.cassandra());
-    }
-
-    @Test
-    void 
provideChoosingConfigurationShouldReturnObjectStorageFactoryWhenConfigurationImplIsObjectStorage()
 throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", 
BlobStoreImplName.OBJECTSTORAGE.getName());
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.objectStorage());
-    }
-
-    @Test
-    void 
provideChoosingConfigurationShouldReturnHybridConfigurationWhenConfigurationImplIsHybrid()
 throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", 
BlobStoreImplName.HYBRID.getName());
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.hybrid());
-    }
-
-    @Test
-    void 
provideChoosingConfigurationShouldReturnCassandraFactoryWhenConfigurationImplIsCassandra()
 throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", 
BlobStoreImplName.CASSANDRA.getName());
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.cassandra());
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldThrowWhenNegative() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", -1);
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> 
module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldNotThrowWhenZero() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", 0);
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        
assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isEqualTo(new HybridBlobStore.Configuration(0));
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldReturnConfiguration() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", 36);
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        
assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isEqualTo(new HybridBlobStore.Configuration(36));
-    }
-
-    @Test
-    void 
providesHybridBlobStoreConfigurationShouldReturnConfigurationWhenLegacyFile() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", 36);
-        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.LEGACY, configuration)
-            .build();
-
-        
assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isEqualTo(new HybridBlobStore.Configuration(36));
-    }
-
-    @Test
-    void 
provideBlobStoreShouldReturnCassandraBlobStoreWhenCassandraConfigured() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-
-        
assertThat(module.provideBlobStore(BlobStoreChoosingConfiguration.cassandra(),
-            CASSANDRA_BLOBSTORE_PROVIDER, OBJECT_STORAGE_BLOBSTORE_PROVIDER, 
HybridBlobStore.Configuration.DEFAULT))
-            .isEqualTo(CASSANDRA_BLOBSTORE);
-    }
-
-    @Test
-    void 
provideBlobStoreShouldReturnObjectStoreBlobStoreWhenObjectStoreConfigured() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-
-        
assertThat(module.provideBlobStore(BlobStoreChoosingConfiguration.cassandra(),
-            CASSANDRA_BLOBSTORE_PROVIDER, OBJECT_STORAGE_BLOBSTORE_PROVIDER, 
HybridBlobStore.Configuration.DEFAULT))
-            .isEqualTo(CASSANDRA_BLOBSTORE);
-    }
-
-    @Test
-    void provideBlobStoreShouldReturnHybridBlobStoreWhenHybridConfigured() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-
-        
assertThat(module.provideBlobStore(BlobStoreChoosingConfiguration.hybrid(),
-            CASSANDRA_BLOBSTORE_PROVIDER, OBJECT_STORAGE_BLOBSTORE_PROVIDER, 
HybridBlobStore.Configuration.DEFAULT))
-            .isInstanceOf(HybridBlobStore.class);
-    }
-}
\ No newline at end of file
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfigurationTest.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java
similarity index 52%
rename from 
server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfigurationTest.java
rename to 
server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java
index 2ef718d..0d65d03 100644
--- 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfigurationTest.java
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java
@@ -19,15 +19,18 @@
 
 package org.apache.james.modules.blobstore;
 
+import static org.apache.james.modules.blobstore.BlobStoreConfiguration.parse;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.james.FakePropertiesProvider;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-class BlobStoreChoosingConfigurationTest {
+class BlobStoreConfigurationTest {
 
     private static final String OBJECT_STORAGE = "objectstorage";
     private static final String CASSANDRA = "cassandra";
@@ -35,15 +38,98 @@ class BlobStoreChoosingConfigurationTest {
 
     @Test
     void shouldMatchBeanContract() {
-        EqualsVerifier.forClass(BlobStoreChoosingConfiguration.class)
+        EqualsVerifier.forClass(BlobStoreConfiguration.class)
             .verify();
     }
 
     @Test
+    void provideChoosingConfigurationShouldThrowWhenMissingPropertyField() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", "");
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> parse(propertyProvider))
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldThrowWhenEmptyPropertyField() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", "");
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> parse(propertyProvider))
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void 
provideChoosingConfigurationShouldThrowWhenPropertyFieldIsNotInSupportedList() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", "gabouzomeuh");
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> parse(propertyProvider))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldReturnCassandraWhenNoFile() throws 
Exception {
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register("other_configuration_file", new 
PropertiesConfiguration())
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.cassandra());
+    }
+
+    @Test
+    void 
provideChoosingConfigurationShouldReturnObjectStorageFactoryWhenConfigurationImplIsObjectStorage()
 throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", 
BlobStoreConfiguration.BlobStoreImplName.OBJECTSTORAGE.getName());
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.objectStorage());
+    }
+
+    @Test
+    void 
provideChoosingConfigurationShouldReturnHybridConfigurationWhenConfigurationImplIsHybrid()
 throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", 
BlobStoreConfiguration.BlobStoreImplName.HYBRID.getName());
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.hybrid());
+    }
+
+    @Test
+    void 
provideChoosingConfigurationShouldReturnCassandraFactoryWhenConfigurationImplIsCassandra()
 throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", 
BlobStoreConfiguration.BlobStoreImplName.CASSANDRA.getName());
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.cassandra());
+    }
+
+
+    @Test
     void fromShouldThrowWhenBlobStoreImplIsMissing() {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
 
-        assertThatThrownBy(() -> 
BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalStateException.class)
             .hasMessage("implementation property is missing please use one of 
supported values in: cassandra, objectstorage, hybrid");
     }
@@ -53,7 +139,7 @@ class BlobStoreChoosingConfigurationTest {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
         configuration.addProperty("implementation", null);
 
-        assertThatThrownBy(() -> 
BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalStateException.class)
             .hasMessage("implementation property is missing please use one of 
supported values in: cassandra, objectstorage, hybrid");
     }
@@ -63,7 +149,7 @@ class BlobStoreChoosingConfigurationTest {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
         configuration.addProperty("implementation", "");
 
-        assertThatThrownBy(() -> 
BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalStateException.class)
             .hasMessage("implementation property is missing please use one of 
supported values in: cassandra, objectstorage, hybrid");
     }
@@ -73,7 +159,7 @@ class BlobStoreChoosingConfigurationTest {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
         configuration.addProperty("implementation", "un_supported");
 
-        assertThatThrownBy(() -> 
BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalArgumentException.class)
             .hasMessage("un_supported is not a valid name of BlobStores, 
please use one of supported values in: cassandra, objectstorage, hybrid");
     }
@@ -84,7 +170,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", CASSANDRA);
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(CASSANDRA);
@@ -96,7 +182,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", HYBRID);
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(HYBRID);
@@ -108,7 +194,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", OBJECT_STORAGE);
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(OBJECT_STORAGE);
@@ -120,7 +206,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", "OBjecTStorAGE");
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(OBJECT_STORAGE);
@@ -132,7 +218,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", " cassandra ");
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(CASSANDRA);
diff --git 
a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java
 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java
new file mode 100644
index 0000000..d736aa8
--- /dev/null
+++ 
b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java
@@ -0,0 +1,105 @@
+/****************************************************************
+ * 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.james.modules.blobstore;
+
+import static 
org.apache.james.modules.blobstore.BlobStoreModulesChooser.HybridDeclarationModule;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.james.FakePropertiesProvider;
+import org.apache.james.blob.union.HybridBlobStore;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
+import org.junit.jupiter.api.Test;
+
+class BlobStoreModulesChooserTest {
+    @Test
+    void providesHybridBlobStoreConfigurationShouldThrowWhenNegative() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", -1);
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> 
module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void providesHybridBlobStoreConfigurationShouldNotThrowWhenZero() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", 0);
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        
assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isEqualTo(new HybridBlobStore.Configuration(0));
+    }
+
+    @Test
+    void providesHybridBlobStoreConfigurationShouldReturnConfiguration() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", 36);
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        
assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isEqualTo(new HybridBlobStore.Configuration(36));
+    }
+
+    @Test
+    void 
providesHybridBlobStoreConfigurationShouldReturnConfigurationWhenLegacyFile() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", 36);
+        FakePropertiesProvider propertyProvider = 
FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.LEGACY, configuration)
+            .build();
+
+        
assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isEqualTo(new HybridBlobStore.Configuration(36));
+    }
+
+    @Test
+    void 
provideBlobStoreShouldReturnObjectStoreBlobStoreWhenObjectStoreConfigured() {
+        
assertThat(BlobStoreModulesChooser.chooseModules(BlobStoreConfiguration.objectStorage()))
+            .first()
+            
.isInstanceOf(BlobStoreModulesChooser.ObjectStorageDeclarationModule.class);
+    }
+
+    @Test
+    void 
provideBlobStoreShouldReturnCassandraBlobStoreWhenCassandraConfigured() {
+        
assertThat(BlobStoreModulesChooser.chooseModules(BlobStoreConfiguration.cassandra()))
+            .first()
+            
.isInstanceOf(BlobStoreModulesChooser.CassandraDeclarationModule.class);
+    }
+
+    @Test
+    void provideBlobStoreShouldReturnHybridBlobStoreWhenHybridConfigured() {
+        
assertThat(BlobStoreModulesChooser.chooseModules(BlobStoreConfiguration.hybrid()))
+            .first()
+            
.isInstanceOf(BlobStoreModulesChooser.HybridDeclarationModule.class);
+    }
+}
\ No newline at end of file
diff --git 
a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
 
b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
index 0988842..212d639 100644
--- 
a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
+++ 
b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
@@ -20,8 +20,12 @@
 package org.apache.james;
 
 import org.apache.james.data.LdapUsersRepositoryModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.server.JMXServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -31,6 +35,21 @@ public class CassandraRabbitMQLdapJamesServerMain implements 
JamesServerMain {
         .with(new LdapUsersRepositoryModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(MODULES, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        BlobStoreConfiguration blobStoreConfiguration = 
BlobStoreConfiguration.parse(configuration);
+
+        Module baseModule = baseModule(blobStoreConfiguration);
+        JamesServerMain.main(configuration,
+            baseModule, new JMXServerModule());
+    }
+
+    public static Module baseModule(BlobStoreConfiguration 
blobStoreConfiguration) {
+        return Modules.combine(ImmutableList.<Module>builder()
+            .add(MODULES)
+            
.addAll(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
+            .build());
     }
 }
diff --git 
a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
 
b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
index 307795e..df6cc67 100644
--- 
a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
+++ 
b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
@@ -32,7 +32,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.SwiftBlobStoreExtension;
 import org.apache.james.modules.TestJMAPServerModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -57,10 +57,8 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     @TestInstance(TestInstance.Lifecycle.PER_CLASS)
     class WithSwift implements ContractSuite {
         @RegisterExtension
-        JamesServerExtension testExtension = baseJamesServerExtensionBuilder()
+        JamesServerExtension testExtension = 
baseJamesServerExtensionBuilder(BlobStoreConfiguration.objectStorage())
             .extension(new SwiftBlobStoreExtension())
-            .overrideServerModule(binder -> 
binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()))
             .build();
     }
 
@@ -68,10 +66,8 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     @TestInstance(TestInstance.Lifecycle.PER_CLASS)
     class WithAwsS3 implements ContractSuite {
         @RegisterExtension
-        JamesServerExtension testExtension = baseJamesServerExtensionBuilder()
+        JamesServerExtension testExtension = 
baseJamesServerExtensionBuilder(BlobStoreConfiguration.objectStorage())
             .extension(new AwsS3BlobStoreExtension())
-            .overrideServerModule(binder -> 
binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()))
             .build();
     }
 
@@ -79,20 +75,18 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     @TestInstance(TestInstance.Lifecycle.PER_CLASS)
     class WithoutSwiftOrAwsS3 implements ContractSuite {
         @RegisterExtension
-        JamesServerExtension testExtension = baseJamesServerExtensionBuilder()
-            .overrideServerModule(binder -> 
binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.cassandra()))
+        JamesServerExtension testExtension = 
baseJamesServerExtensionBuilder(BlobStoreConfiguration.cassandra())
             .build();
     }
 
-    JamesServerBuilder baseJamesServerExtensionBuilder() {
+    JamesServerBuilder baseJamesServerExtensionBuilder(BlobStoreConfiguration 
blobStoreConfiguration) {
         return new JamesServerBuilder()
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(new RabbitMQExtension())
             .extension(new LdapTestExtension())
             .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQLdapJamesServerMain.MODULES)
+                
.combineWith(CassandraRabbitMQLdapJamesServerMain.baseModule(blobStoreConfiguration))
                 .overrideWith(new TestJMAPServerModule())
                 
.overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
     }
diff --git 
a/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
 
b/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
index 357b380..c9d3ffb 100644
--- 
a/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
+++ 
b/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
@@ -24,15 +24,11 @@ import 
org.apache.james.server.core.configuration.Configuration;
 import com.google.inject.Module;
 
 public interface JamesServerMain {
-    static void main(Module... modules) throws Exception {
-        Configuration configuration = Configuration.builder()
-            .useWorkingDirectoryEnvProperty()
-            .build();
-
+    static void main(Configuration configuration, Module... modules) throws 
Exception {
         GuiceJamesServer server = 
GuiceJamesServer.forConfiguration(configuration)
             .combineWith(modules);
         server.start();
-        
+
         Runtime.getRuntime().addShutdownHook(new Thread(server::stop));
     }
 }
diff --git 
a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
 
b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
index 19ba467..f497a41 100644
--- 
a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ 
b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -49,6 +49,7 @@ import org.apache.james.modules.server.SwaggerRoutesModule;
 import org.apache.james.modules.server.TaskManagerModule;
 import org.apache.james.modules.server.WebAdminServerModule;
 import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
@@ -94,7 +95,11 @@ public class JPAJamesServerMain implements JamesServerMain {
     public static final Module JPA_MODULE_AGGREGATE = 
Modules.combine(JPA_SERVER_MODULE, PROTOCOLS);
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(JPA_MODULE_AGGREGATE, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, JPA_MODULE_AGGREGATE, new 
JMXServerModule());
     }
 
 }
diff --git 
a/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
 
b/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
index d6b137f..ea629b2 100644
--- 
a/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ 
b/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -34,6 +34,7 @@ import org.apache.james.modules.server.NoJwtModule;
 import org.apache.james.modules.server.RawPostDequeueDecoratorModule;
 import org.apache.james.modules.server.TaskManagerModule;
 import org.apache.james.modules.server.WebAdminServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
@@ -59,7 +60,11 @@ public class JPAJamesServerMain implements JamesServerMain {
         new ElasticSearchMetricReporterModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(JPA_SERVER_MODULE,  PROTOCOLS, new 
DKIMMailetModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, JPA_SERVER_MODULE,  PROTOCOLS, new 
DKIMMailetModule());
     }
 
 }
diff --git 
a/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
 
b/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
index 9a19fae..05c6649 100644
--- 
a/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
+++ 
b/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
@@ -56,6 +56,7 @@ import org.apache.james.modules.server.WebAdminServerModule;
 import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
 import org.apache.james.modules.vault.DeletedMessageVaultModule;
 import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
+import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.NoAuthenticationFilter;
@@ -133,7 +134,14 @@ public class MemoryJamesServerMain implements 
JamesServerMain {
         new DKIMMailetModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(IN_MEMORY_SERVER_AGGREGATE_MODULE, new 
FakeSearchMailboxModule(), new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration,
+                IN_MEMORY_SERVER_AGGREGATE_MODULE,
+                new FakeSearchMailboxModule(),
+                new JMXServerModule());
     }
 
 }
diff --git 
a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
 
b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
index f0a5270..e9e07d9 100644
--- 
a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
+++ 
b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 public class RabbitMQAwsS3SendMDNMethodTest extends SendMDNMethodTest {
@@ -44,7 +45,7 @@ public class RabbitMQAwsS3SendMDNMethodTest extends 
SendMDNMethodTest {
             .extension(new AwsS3BlobStoreExtension())
             .extension(new RabbitMQExtension())
             .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+                
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
                 .overrideWith(binder -> 
binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(new TestJMAPServerModule()))
             .build();
diff --git 
a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
 
b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
index dad433b..9add76d 100644
--- 
a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
+++ 
b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQAwsS3SpamAssassinContractTest implements SpamAssassinContract {
@@ -44,7 +45,7 @@ class RabbitMQAwsS3SpamAssassinContractTest implements 
SpamAssassinContract {
         .extension(new AwsS3BlobStoreExtension())
         .extension(spamAssassinExtension)
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> 
binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestJMAPServerModule()))
         .build();
diff --git 
a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
 
b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
index 972dea2..e26ced9 100644
--- 
a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
+++ 
b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
@@ -39,6 +39,7 @@ import org.apache.james.modules.DockerRabbitMQRule;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.CassandraTruncateTableTask;
 import org.apache.james.server.core.configuration.Configuration;
@@ -83,7 +84,7 @@ public class RabbitMQAwsS3Stepdefs {
                 .build();
 
         mainStepdefs.jmapServer = 
GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
                 .overrideWith(new TestJMAPServerModule())
                 .overrideWith(new 
TestDockerESMetricReporterModule(elasticSearch.getDockerEs().getHttpHost()))
                 .overrideWith(new 
TestRabbitMQModule(rabbitMQServer.dockerRabbitMQ()))
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
index e37753b..c7f6bf6 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
@@ -56,14 +56,15 @@ import 
org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.QuotaProbesImpl;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.GuiceProbe;
-import org.apache.james.utils.TestIMAPClient;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.TestIMAPClient;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
@@ -127,7 +128,7 @@ class ConsistencyTasksIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule())
             // Enforce a single eventBus retry. Required as Current Quotas are 
handled by the eventBus.
             .overrideWith(binder -> 
binder.bind(RetryBackoffConfiguration.class)
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
index 6a81213..2f4beb1 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
@@ -70,6 +70,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.server.CassandraProbe;
 import org.apache.james.task.TaskManager;
 import org.apache.james.util.Port;
@@ -114,7 +115,7 @@ class FixingGhostMailboxTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
index d054d55..db84cb2 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.AuthorizedEndpointsTest;
 import org.apache.james.webadmin.integration.UnauthorizedModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
@@ -44,7 +45,7 @@ class RabbitMQAuthorizedEndpointsTest extends 
AuthorizedEndpointsTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new UnauthorizedModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
index 671be90..16aeca7 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
@@ -57,6 +57,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.WebAdminGuiceProbe;
@@ -205,7 +206,7 @@ class RabbitMQEventDeadLettersIntegrationTest {
         .extension(RABBIT_MQ_EXTENSION)
         .extension(new RetryEventsListenerExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule())
             .overrideWith(binder -> 
binder.bind(RetryBackoffConfiguration.class)
                 .toInstance(RetryBackoffConfiguration.builder()
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
index 918eea9..4010e06 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import 
org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationContract;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -41,7 +42,7 @@ class RabbitMQFastViewProjectionHealthCheckIntegrationTest 
extends FastViewProje
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
index 1e1217a..dfa93ad 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.ForwardIntegrationTest;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -41,7 +42,7 @@ class RabbitMQForwardIntegrationTest extends 
ForwardIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
index a6d8467..57ac262 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestRabbitMQModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.util.FunctionalUtils;
@@ -153,7 +154,7 @@ public class RabbitMQJmapExtension implements 
BeforeAllCallback, AfterAllCallbac
                 .build();
 
         return GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
                 .overrideWith(binder -> 
binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(new 
TestDockerESMetricReporterModule(elasticSearchRule.getDockerEs().getHttpHost()))
                 .overrideWith(cassandra.getModule())
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
index d59f99b..62a3267 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.jwt.JwtConfiguration;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.JwtFilter;
 import org.apache.james.webadmin.integration.JwtFilterIntegrationTest;
@@ -43,7 +44,7 @@ class RabbitMQJwtFilterIntegrationTest extends 
JwtFilterIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> 
binder.bind(AuthenticationFilter.class).to(JwtFilter.class))
             .overrideWith(binder -> 
binder.bind(JwtConfiguration.class).toInstance(jwtConfiguration()))
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
index 2dbf39a..0693461 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
@@ -46,6 +46,7 @@ import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.util.Port;
 import org.apache.james.utils.DataProbeImpl;
@@ -81,7 +82,7 @@ class RabbitMQReindexingWithEventDeadLettersTest {
 
     private static final JamesServerBuilder.ServerProvider 
CONFIGURATION_BUILDER = configuration -> GuiceJamesServer
         .forConfiguration(configuration)
-        .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+        
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
         .overrideWith(new TestJMAPServerModule())
         .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE)
         .overrideWith(new WebadminIntegrationTestModule());
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
index c107aa6..69578e6 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
@@ -39,6 +39,7 @@ import 
org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManage
 import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.WebAdminServerIntegrationTest;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.apache.james.webadmin.routes.AliasRoutes;
@@ -64,7 +65,7 @@ class RabbitMQWebAdminServerIntegrationTest extends 
WebAdminServerIntegrationTes
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
index 124c4dd..bfbf653f 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
@@ -68,6 +68,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.EventDeadLettersProbe;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.task.TaskManager;
 import org.apache.james.utils.DataProbeImpl;
@@ -102,7 +103,7 @@ class 
RabbitMQWebAdminServerTaskSerializationIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
index 7315009..e0f3d67 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import 
org.apache.james.modules.vault.TestDeleteMessageVaultPreDeletionHookModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import 
org.apache.james.webadmin.integration.vault.DeletedMessageVaultIntegrationTest;
@@ -45,7 +46,7 @@ class RabbitMQDeletedMessageVaultIntegrationTest extends 
DeletedMessageVaultInte
         .extension(new RabbitMQExtension())
         .extension(new ClockExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestDeleteMessageVaultPreDeletionHookModule())
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
index 4ef4f8b..179d642 100644
--- 
a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
+++ 
b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
@@ -33,6 +33,7 @@ import org.apache.james.modules.LinshareGuiceExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import 
org.apache.james.modules.vault.TestDeleteMessageVaultPreDeletionHookModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import 
org.apache.james.webadmin.integration.vault.LinshareBlobExportMechanismIntegrationTest;
@@ -47,7 +48,7 @@ class RabbitMQLinshareBlobExportMechanismIntegrationTest 
extends LinshareBlobExp
         .extension(new AwsS3BlobStoreExtension())
         .extension(new LinshareGuiceExtension())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            
.combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> 
binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new 
TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to