온프레미스 개발환경

[5탄] WAR 배포 실패 1 - Logback 충돌

finvault 2026. 4. 1. 18:28

👈 이전 글: [4탄] STS 설치 & JBoss 서버 연동


이 번장은 JBOSS 에 WAR 배포 과정을 진행 하도록 하겠습니다

 

순수 아무런 작업을 하지 않고 바로 WAR를 배포 하는 순진 모드로 진행 해보고 이 와 같은 작업을 통해 나오는 엄청난 에러 로그 등을 보면서 하나 하나 잡아 가도록 하겠습니다

이 최신 스택(Spring Boot 4.x + JBoss EAP 8.x)의 조합에서 가장 먼저, 그리고 가장 뼈아프게 직면하는 문제가 바로 **'로깅 라이브러리 충돌'**입니다.

이번 5탄에서는 서버가 뻗어버린 원인을 정확히 분석하고, Gradle을 통해 의존성을 도려내는 작업을 진행하겠습니다.

 

01. 배포 실패 현상 및 로그 분석

STS의 Servers 탭에서 JBoss를 기동하면 콘솔(Console)에 다음과 같은 로그가 수십 줄 쏟아집니다.

 

Plaintext
 
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 WAR 내장]
Logback (spring-boot-starter-logging 기본 포함)
↕ 충돌!
[JBoss EAP 8.1 내장 코어 모듈]
slf4j-jboss-logmanager-2.0.1.Final-redhat-00001.jar

 

 

충돌 원인 상세

  • 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

 

폴더명: WEB-INF → Finish
폴더 폴더명: WEB-INF → Finish

 

Src/main에서 webapp 폴더 추가
Src/main에서 webapp 폴더 추가
src/ main/webapp 추가
src/ main/webapp 추가

 

 

 

Step 2. jboss-deployment-structure.xml 생성

 

 

src/main/webapp/WEB-INF 폴더 선택

Ctrl + N → XML File 검색 → Next

파일명: jboss-deployment-structure.xml

Finish

 

XML 형식지정
XML 형식지정

 

jboss-deployment-structure.xml 생성
jboss-deployment-structure.xml 생성

 

 

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>

 

 

XML 내용 입력
XML 내용 입력

 

 

💡 이 파일의 역할:

   JBoss에게 WAR 배포 시 지정한 모듈들을 로드하지 말라고 명시적으로 지시합니다.

   JBoss 자체 slf4j, logmanager 모듈을 제외하여 Spring Boot가 주도권을 가질 수 있게 1차 방어막을 칩니다.

 

 

결과

 

Plaintext
 
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 클릭

하단 진행 표시줄이 끝나면 완료!

 

Refresh
Refresh

 

⚠️ 이전 빌드 찌꺼기 주의!

  기존 실패하면서 생긴 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 보러가기