👈 이전 글: [4탄] STS 설치 & JBoss 서버 연동
이 번장은 JBOSS 에 WAR 배포 과정을 진행 하도록 하겠습니다
순수 아무런 작업을 하지 않고 바로 WAR를 배포 하는 순진 모드로 진행 해보고 이 와 같은 작업을 통해 나오는 엄청난 에러 로그 등을 보면서 하나 하나 잡아 가도록 하겠습니다
이 최신 스택(Spring Boot 4.x + JBoss EAP 8.x)의 조합에서 가장 먼저, 그리고 가장 뼈아프게 직면하는 문제가 바로 **'로깅 라이브러리 충돌'**입니다.
이번 5탄에서는 서버가 뻗어버린 원인을 정확히 분석하고, Gradle을 통해 의존성을 도려내는 작업을 진행하겠습니다.
01. 배포 실패 현상 및 로그 분석
STS의 Servers 탭에서 JBoss를 기동하면 콘솔(Console)에 다음과 같은 로그가 수십 줄 쏟아집니다.
16:55:55,093 INFO [org.jboss.modules] (main) JBoss Modules version 2.1.6.Final-redhat-00001
16:55:55,479 INFO [org.jboss.msc] (main) JBoss MSC version 1.5.5.Final-redhat-00001
16:55:55,485 INFO [org.jboss.threads] (main) JBoss Threads version 2.4.0.Final-redhat-00001
16:55:55,562 INFO [org.jboss.as] (MSC service thread 1-2) WFLYSRV0049: JBoss EAP 8.1 (WildFly Core 27.1.0.Final-redhat-00010) starting
16:55:56,267 INFO [org.wildfly.security] (Controller Boot Thread) ELY00001: WildFly Elytron version 2.6.4.Final-redhat-00001
16:55:56,780 INFO [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) WFLYDS0004: Found FinVault.war in deployment directory. To trigger deployment create a file called FinVault.war.dodeploy
16:55:56,825 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0039: Creating http management service using socket-binding (management-http)
16:55:56,838 INFO [org.xnio] (MSC service thread 1-2) XNIO version 3.8.16.Final-redhat-00001
16:55:56,845 INFO [org.xnio.nio] (MSC service thread 1-2) XNIO NIO Implementation Version 3.8.16.Final-redhat-00001
16:55:56,883 INFO [org.wildfly.extension.elytron.oidc._private] (ServerService Thread Pool -- 51) WFLYOIDC0001: Activating WildFly Elytron OIDC Subsystem
16:55:56,884 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 53) WFLYCLINF0001: Activating Infinispan subsystem.
16:55:56,887 WARN [org.jboss.as.txn] (ServerService Thread Pool -- 70) WFLYTX0013: The node-identifier attribute on the /subsystem=transactions is set to the default value. This is a danger for environments running multiple servers. Please make sure the attribute value is unique.
16:55:56,887 INFO [org.wildfly.extension.health] (ServerService Thread Pool -- 52) WFLYHEALTH0001: Activating Base Health Subsystem
16:55:56,896 INFO [org.jboss.as.jsf] (ServerService Thread Pool -- 60) WFLYJSF0007: Activated the following Jakarta Server Faces Implementations: [main]
16:55:56,898 INFO [org.jboss.as.jaxrs] (ServerService Thread Pool -- 55) WFLYRS0016: RESTEasy version 6.2.12.Final-redhat-00001
16:55:56,910 INFO [org.wildfly.extension.metrics] (ServerService Thread Pool -- 62) WFLYMETRICS0001: Activating Base Metrics Subsystem
16:55:56,924 INFO [org.jboss.as.naming] (ServerService Thread Pool -- 63) WFLYNAM0001: Activating Naming Subsystem
16:55:56,927 INFO [org.jboss.as.webservices] (ServerService Thread Pool -- 72) WFLYWS0002: Activating WebServices Extension
16:55:56,945 INFO [org.wildfly.extension.io] (ServerService Thread Pool -- 54) WFLYIO001: Worker 'default' has auto-configured to 32 IO threads with 256 max task threads based on your 16 available processors
16:55:56,949 INFO [org.jboss.as.connector] (MSC service thread 1-3) WFLYJCA0009: Starting Jakarta Connectors Subsystem (WildFly/IronJacamar 3.0.14.Final-redhat-00001)
16:55:56,959 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) WFLYSRV0027: Starting deployment of "FinVault.war" (runtime-name: "FinVault.war")
16:55:56,974 INFO [org.wildfly.extension.undertow] (MSC service thread 1-8) WFLYUT0003: Undertow 2.3.18.SP1-redhat-00001 starting
16:55:56,988 INFO [org.jboss.as.naming] (MSC service thread 1-5) WFLYNAM0003: Starting Naming Service
16:55:56,988 INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 42) WFLYJCA0004: Deploying JDBC-compliant driver class org.h2.Driver (version 2.2)
16:55:56,990 INFO [org.jboss.as.mail.extension] (MSC service thread 1-5) WFLYMAIL0001: Bound mail session [java:jboss/mail/Default]
16:55:57,024 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-4) WFLYJCA0018: Started Driver service with driver-name = h2
16:55:57,039 WARN [org.wildfly.extension.elytron] (MSC service thread 1-2) WFLYELY00023: KeyStore file 'C:\projects\was\jboss-eap-8.1\standalone\configuration\application.keystore' does not exist. Used blank.
16:55:57,048 INFO [org.jboss.remoting] (MSC service thread 1-5) JBoss Remoting version 5.0.31.Final-redhat-00001
16:55:57,111 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 71) WFLYUT0014: Creating file handler for path 'C:\projects\was\jboss-eap-8.1/welcome-content' with options [directory-listing: 'false', follow-symlink: 'false', case-sensitive: 'true', safe-symlink-paths: '[]']
16:55:57,120 WARN [org.wildfly.extension.elytron] (MSC service thread 1-8) WFLYELY01084: KeyStore C:\projects\was\jboss-eap-8.1\standalone\configuration\application.keystore not found, it will be auto-generated on first use with a self-signed certificate for host localhost
16:55:57,171 INFO [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT0012: Started server default-server.
16:55:57,174 INFO [org.wildfly.extension.undertow] (MSC service thread 1-1) Queuing requests.
16:55:57,177 INFO [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT0018: Host default-host starting
16:55:57,244 INFO [org.jboss.as.ejb3] (MSC service thread 1-7) WFLYEJB0481: Strict pool slsb-strict-max-pool is using a max instance size of 256 (per class), which is derived from thread worker pool sizing.
16:55:57,244 INFO [org.jboss.as.ejb3] (MSC service thread 1-6) WFLYEJB0482: Strict pool mdb-strict-max-pool is using a max instance size of 64 (per class), which is derived from the number of CPUs on this host.
16:55:57,334 INFO [org.wildfly.extension.undertow] (MSC service thread 1-5) WFLYUT0006: Undertow HTTP listener default listening on 127.0.0.1:8080
16:55:57,426 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-7) WFLYDS0013: Started FileSystemDeploymentService for directory C:\projects\was\jboss-eap-8.1\standalone\deployments
16:55:57,533 INFO [org.wildfly.extension.undertow] (MSC service thread 1-6) WFLYUT0006: Undertow HTTPS listener https listening on 127.0.0.1:8443
16:55:57,599 INFO [org.jboss.as.ejb3] (MSC service thread 1-1) WFLYEJB0493: Jakarta Enterprise Beans subsystem suspension complete
16:55:57,656 INFO [org.jboss.ws.common.management] (MSC service thread 1-2) JBWS022052: Starting JBossWS 7.3.3.Final-redhat-00001 (Apache CXF 4.0.8.redhat-00001)
16:55:57,665 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-6) WFLYJCA0001: Bound data source [java:jboss/datasources/ExampleDS]
16:56:00,325 WARN [org.jboss.as.dependency.private] (MSC service thread 1-8) WFLYSRV0018: Deployment "deployment.FinVault.war" is using a private module ("org.jboss.vfs") which may be changed or removed in future versions without notice.
16:56:00,415 INFO [org.jboss.weld.deployer] (MSC service thread 1-7) WFLYWELD0003: Processing weld deployment FinVault.war
16:56:00,584 INFO [org.hibernate.validator.internal.util.Version] (MSC service thread 1-7) HV000001: Hibernate Validator 8.0.2.Final-redhat-00001
16:56:00,893 INFO [org.jboss.weld.Version] (MSC service thread 1-4) WELD-000900: 5.1.6 (redhat)
16:56:01,640 INFO [io.undertow.servlet] (ServerService Thread Pool -- 94) 1 Spring WebApplicationInitializers detected on classpath
16:56:01,763 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 94) MSC000001: Failed to start service jboss.deployment.unit."FinVault.war".undertow-deployment: org.jboss.msc.service.StartException in service jboss.deployment.unit."FinVault.war".undertow-deployment: java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:73)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:257)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:88)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:70)
... 8 more
Caused by: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
at deployment.FinVault.war//org.springframework.util.Assert.state(Assert.java:102)
at deployment.FinVault.war//org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:420)
at deployment.FinVault.war//org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:130)
at deployment.FinVault.war//org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:240)
at deployment.FinVault.war//org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:222)
at deployment.FinVault.war//org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180)
at deployment.FinVault.war//org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173)
at deployment.FinVault.war//org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151)
at deployment.FinVault.war//org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
at deployment.FinVault.war//org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:137)
at deployment.FinVault.war//org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:76)
at deployment.FinVault.war//org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:56)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at deployment.FinVault.war//org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:123)
at deployment.FinVault.war//org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:56)
at deployment.FinVault.war//org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at deployment.FinVault.war//org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:205)
at deployment.FinVault.war//org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:181)
at deployment.FinVault.war//org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:109)
at deployment.FinVault.war//org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:204)
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:187)
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:255)
... 10 more
16:56:01,766 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "FinVault.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"FinVault.war\".undertow-deployment" => "java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
Caused by: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml"}}
16:56:01,808 INFO [org.jboss.as.server] (ServerService Thread Pool -- 43) WFLYSRV0010: Deployed "FinVault.war" (runtime-name : "FinVault.war")
16:56:01,809 INFO [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: Service status report
WFLYCTL0186: Services which failed to start: service jboss.deployment.unit."FinVault.war".undertow-deployment: java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
WFLYCTL0448: 1 additional services are down due to their dependencies being missing or failed
16:56:01,852 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server
16:56:01,860 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
16:56:01,861 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
16:56:01,863 ERROR [org.jboss.as] (Controller Boot Thread) WFLYSRV0026: JBoss EAP 8.1 (WildFly Core 27.1.0.Final-redhat-00010) started (with errors) in 7104ms - Started 578 of 787 services (3 services failed or missing dependencies, 328 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml
엔지니어는 수많은 에러 스택 트레이스 속에서 진짜 원인이 되는 **Caused by**를 찾아내야 합니다.
스크롤을 내려보면 핵심 에러가 보입니다.
🔍 핵심 에러 메시지 (Caused by)
Caused by: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/FinVault/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/).
02. 원인 분석 (Why?)
에러 메시지가 매우 친절하게 원인을 알려주고 있습니다. **"LoggerFactory가 Logback의 Context가 아닌데, 클래스 패스(Classpath)에는 Logback이 존재한다"**는 뜻입니다.
충돌 원인 상세
- Spring Boot의 고집: Spring Boot는 태생적으로 Logback을 기본 로깅 구현체로 사용하려 합니다. (빌드된 WAR 파일 안에 logback-classic.jar가 포함되어 있음)
- JBoss EAP의 텃세: JBoss 서버는 자체적으로 slf4j-jboss-logmanager라는 강력한 로깅 서브시스템을 코어 모듈로 가지고 있으며, 배포되는 모든 WAR 파일에 이 로깅 시스템을 강제로 주입합니다.
- 충돌 발생: WAR가 배포되는 순간, Spring Boot가 가져온 Logback과 JBoss가 주입한 JBoss LogManager가 런타임 메모리(Class Loader) 상에서 SLF4J 인터페이스의 구현체 자리를 놓고 주도권 싸움을 벌이다가 서버가 뻗어버립니다.
충돌 요약
| 구분 | 로깅 구현체 | 위치 |
| JBoss EAP 8.1 | slf4j-jboss-logmanager | JBoss modules 폴더 |
| Spring Boot WAR | Logback | WAR 내 WEB-INF/lib |
| 결과 | 두 구현체 충돌 | 배포 실패! |
03. 1차 해결 시도 - jboss-deployment-structure.xml
해결 방향
JBoss에게 배포 시 특정 모듈을 제외하도록 명시적으로 지시!
↓
jboss-deployment-structure.xml 파일로 제어
Step 1. webapp/WEB-INF 폴더 생성
src/main 폴더 선택
↓
Ctrl + N → General → Folder → Next
↓
폴더명: webapp → Finish src/main/webapp 폴더 선택
↓
Ctrl + N → General → Folder → Next
↓
폴더명: WEB-INF → Finish



Step 2. jboss-deployment-structure.xml 생성
src/main/webapp/WEB-INF 폴더 선택
↓
Ctrl + N → XML File 검색 → Next
↓
파일명: jboss-deployment-structure.xml
↓
Finish


Step 3. XML 내용 입력
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.slf4j"/>
<module name="org.slf4j.impl"/>
<module name="org.jboss.logmanager"/>
<module name="org.jboss.logmanager.log4j2"/>
</exclusions>
<local-last value="false"/>
</deployment>
</jboss-deployment-structure>

💡 이 파일의 역할:
JBoss에게 WAR 배포 시 지정한 모듈들을 로드하지 말라고 명시적으로 지시합니다.
JBoss 자체 slf4j, logmanager 모듈을 제외하여 Spring Boot가 주도권을 가질 수 있게 1차 방어막을 칩니다.
결과
17:02:46,261 INFO [io.undertow.servlet] (ServerService Thread Pool -- 98) 1 Spring WebApplicationInitializers detected on classpath
17:02:46,358 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 98) MSC000001: Failed to start service jboss.deployment.unit."FinVault.war".undertow-deployment: org.jboss.msc.service.StartException in service jboss.deployment.unit."FinVault.war".undertow-deployment: java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:73)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
at io.undertow.servlet@2.3.18.SP1-redhat-00001//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:257)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:88)
at org.wildfly.extension.undertow@8.1.0.GA-redhat-00015//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:70)
... 8 more
Caused by: java.lang.IllegalStateException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Slf4jLoggerFactory loaded from jar:file:/C:/projects/was/jboss-eap-8.1/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml
at deployment.FinVault.war/
jboss-deployment-structure.xml 적용 후에도 여전히 에러 발생!
↓
결론: build.gradle에서도 원인 제공자인 Logback 자체를 제거해야 함!
04. 2차 해결 - build.gradle 의존성 수술
해결책은 명확합니다.
어차피 이 프로젝트는 외장 WAS인 JBoss 위에서 돌아갈 것이므로, 로깅의 통제권은 JBoss에게 넘겨주는 것이 엔터프라이즈 아키텍처 원칙에 맞습니다.
따라서 Spring Boot가 기본적으로 끌고 들어오는 **Logback 의존성을 완벽하게 제거(Exclude)**해야 합니다.
build.gradle 수정
repositories {
mavenCentral()
}
// [해결책] 로깅 충돌 방지를 위한 의존성 강제 제거
configurations {
all {
exclude group: 'ch.qos.logback'
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat-runtime'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
Gradle Refresh 실행
build.gradle을 수정했다고 끝이 아닙니다. 변경된 의존성을 프로젝트에 반영해야 합니다.
STS Package Explorer에서 FinVault 프로젝트 우클릭
↓
Gradle → Refresh Gradle Project 클릭
↓
하단 진행 표시줄이 끝나면 완료!

⚠️ 이전 빌드 찌꺼기 주의!
기존 실패하면서 생긴 WAR 파일 등이 빌드 폴더에 남아있을 수 있습니다. Gradle Refresh 후 반드시 clean 빌드를 실행 하여 찌꺼기를 날려주세요.
05. 이번 탄 트러블슈팅 요약
| 에러 코드 | 원인 | 해결 방법 |
| MSC000001 | 배포 서비스 시작 실패 | jboss-deployment-structure.xml 생성 |
| WFLYCTL0080 | JBoss 배포 작업 실패 | build.gradle Logback 제거 |
| LoggerFactory 충돌 | JBoss slf4j vs Spring Boot Logback | 위 두 가지 해결책 병행 적용 |
06. 이번 탄 완료 체크리스트
- [ ] 에러 로그 분석 - MSC000001, WFLYCTL0080 확인
- [ ] 충돌 원인 파악 - JBoss slf4j vs Spring Boot Logback
- [ ] src/main/webapp 폴더 생성
- [ ] src/main/webapp/WEB-INF 폴더 생성
- [ ] jboss-deployment-structure.xml 생성 및 내용 입력
- [ ] build.gradle configurations에 Logback exclude 추가
- [ ] Gradle Refresh 실행
- [ ] clean 빌드 재실행
07. 다음 편 예고
"로깅 충돌의 원인인 Logback을 도려냈으니 이제 배포가 성공하겠지!"라고 생각하며 다시 JBoss를 기동해 보시겠지만... 안타깝게도 에러는 여기서 끝나지 않습니다.
Logback을 치웠더니, 이번에는 "웹 애플리케이션의 핵심인 spring-web 라이브러리가 WAR 파일에서 통째로 사라지는" 기현상이 발생합니다.
이어지는 [6탄] WAR 배포 실패 2 - spring-web 누락 & tomcat-runtime에서는, Spring Boot 4.0의 모듈 구조 변경이 외장 WAS 배포에 어떤 영향을 미치는지 분석하고, providedRuntime 설정을 교정하여 마침내 **'Hello World'**를 띄우는 감격스러운 순간을 맞이하겠습니다.
👉 [6탄] WAR 배포 실패 2 - spring-web 누락 & tomcat-runtime 보러가기
'온프레미스 개발환경' 카테고리의 다른 글
| [7탄] Gradle 기반 JBoss 자동 배포 스크립트 완성 (0) | 2026.04.02 |
|---|---|
| [6탄] WAR 배포 실패 2 - spring-web 누락 & tomcat-runtime (0) | 2026.04.01 |
| [4탄] STS 설치 & JBoss 서버 연동 (0) | 2026.04.01 |
| [3탄] JBoss EAP 8.1 환경설정 & 구동 확인 (0) | 2026.04.01 |
| [2탄] JDK21 독립 설치 & JBoss EAP 8.1 설치 (0) | 2026.04.01 |