Spring boot에서 embeded tomcat 설정으로 문제없이 작업하다가 실제 운영환경인 REDHAT JBoss 환경으로 실행 테스트를 해보고자 했습니다. 동일 환경의 오픈소스인 Wildfly 버전으로 환경을 구성했습니다.
개발환경
- IDE: IntelliJ
- Wildfly 26 - Jakarta EE 8 Full & Web Distribution
- Java 11
- Spring boot 2.7.x
- Windows 10
WildFly 환경 셋업
wildfly 홈페이지에서 Wildfly 26 - Jakarta EE 8 Full & Web Distribution을 다운받고 실행했습니다.
다운로드 받은 zip파일 압축을 풉니다.
Wildfly 버전 호환 문제
최신의 28.0.0.1Final에 Wildfly distribution파일을 받고 실행했으나 Spring의 Jakarta EE 호환버전 문제인건지, 해당 버전은 web(mvc)를 호환하지 못하는건지 계속 오류가 났습니다. 아래는 오류의 일부 내용입니다.
16:05:41,576 WARN [org.jboss.modules.define] (MSC service thread 1-7) Failed to define class
org.springframework.web.servlet.tags.form.HiddenInputTag in Module "deployment.kss-0.0.1-SNAPSHOT.war" from Service Module
Loader: java.lang.NoClassDefFoundError: Failed to link org/springframework/web/servlet/tags/form/HiddenInputTag (Module
"deployment.kss-0.0.1-SNAPSHOT.war" from Service Module Loader): Failed to link
org/springframework/web/servlet/tags/form/AbstractHtmlElementTag (Module "deployment.kss-0.0.1-SNAPSHOT.war" from Service Module
Loader): javax/servlet/jsp/tagext/DynamicAttributes
servlet관련 dependency 참조 오류로만 생각하고 많은 삽질을 하였으나, 정확한 오류원인을 파악하지 못하고 Wildfly 26 - Jakarta EE 8 Full & Web Distribution
버전을 다시 다운받아 war를 배포했습니다.
| Spring 2.7.x는 EE8 버전, 3.x 이후부터는 EE9 버전과 호환
WildFly user 생성
WildFly는 관리자콘솔을 제공합니다. default 유저가 없으므로 새로운 유저를 등록합니다.
bin폴더에 add-user.bat
을 실행합니다.
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a):
- 위와 같은 프롬프트가 나오면, Management User를 선택하고 username / password를 입력합니다.
WildFly 실행
다운로드 받은 zip파일을 풀고 bin폴더에 standalone.bat
을 실행합니다.
16:28:16,862 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 26.0.0.Final (WildFly Core 18.0.0.Final) started in 1965ms - Started 298 of 538 services (337 services are lazy, passive or on-demand)
16:28:16,863 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
16:28:16,864 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
- 9990 포트로 관리자콘솔이 서비스됩니다. 위에서 생성한 유저와 비번을 입력하여 접속합니다.
Upload deployment
를 선택하여 배포하고자 하는 war를 드래그앤드랍으로 가져다 놓습니다.
로그 모듈 충돌
Spring 로그모듈과 WildFly 내장 로그모듈간 충돌 문제로 아래와 같이 정상동작하지 않는 경우 설정파일을 통해 해결합니다.
16:35:06,871 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 1)
WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "kss-0.0.1-SNAPSHOT.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"kss-0.0.1-SNAPSHOT.war\".undertow-deployment" =>
"java.lang.RuntimeException: java.lang.IllegalArgumentException: 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:/D:/wildfly-26.0.0.Final/modules/system/layers/base/org/slf4j/impl/main/slf4j-jboss-logmanager-1.1.0.Final.jar!/). If
you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml:
org.slf4j.impl.Slf4jLoggerFactory
WEB-INF/jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.slf4j"/>
<module name="org.slf4j.impl"/>
</exclusions>
</deployment>
</jboss-deployment-structure>
- 재빌드 후 생성된 war를 배포하여 재실행합니다.
정상 실행 로그
[2023-07-10 04:39:13,549] Artifact Gradle : kr.ac.kuh : krs-0.0.1-SNAPSHOT.war: Artifact is being deployed, please wait...
16:39:13,659 INFO [org.jboss.as.server.deployment] (MSC service thread 1-7) WFLYSRV0027: Starting deployment of "kss-0.0.1-SNAPSHOT.war" (runtime-name: "kss-0.0.1-SNAPSHOT.war")
...중략...
16:39:18,235 INFO [org.infinispan.CONTAINER] (ServerService Thread Pool -- 5) ISPN000025: wakeUpInterval is <= 0, not starting expired purge thread
16:39:18,249 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 5) WFLYCLINF0002: Started http-remoting-connector cache from ejb container
16:39:18,335 INFO [io.undertow.servlet] (ServerService Thread Pool -- 14) 2 Spring WebApplicationInitializers detected on classpath
16:39:18,692 INFO [stdout] (ServerService Thread Pool -- 14)
16:39:18,692 INFO [stdout] (ServerService Thread Pool -- 14) . ____ _ __ _ _
16:39:18,692 INFO [stdout] (ServerService Thread Pool -- 14) /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
16:39:18,692 INFO [stdout] (ServerService Thread Pool -- 14) ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
16:39:18,692 INFO [stdout] (ServerService Thread Pool -- 14) \\/ ___)| |_)| | | | | || (_| | ) ) ) )
16:39:18,692 INFO [stdout] (ServerService Thread Pool -- 14) ' |____| .__|_| |_|_| |_\__, | / / / /
16:39:18,693 INFO [stdout] (ServerService Thread Pool -- 14) =========|_|==============|___/=/_/_/_/
16:39:18,693 INFO [stdout] (ServerService Thread Pool -- 14) :: Spring Boot :: (v2.7.2)
16:39:18,693 INFO [stdout] (ServerService Thread Pool -- 14)
16:39:18,704 INFO [org.hibernate.validator.internal.util.Version] (background-preinit) HV000001: Hibernate Validator 6.0.22.Final
16:39:18,734 INFO [kr.ac.kuh.krs.ServletInitializer] (ServerService Thread Pool -- 14) Starting ServletInitializer using Java 11.0.17 on user1 with PID 5036 (started by user1 in D:\wildfly-26.0.0.Final\bin)
16:39:18,735 INFO [kr.ac.kuh.krs.ServletInitializer] (ServerService Thread Pool -- 14) The following 1 profile is active: "local"
16:39:19,297 INFO [io.undertow.servlet] (ServerService Thread Pool -- 14) Initializing Spring embedded WebApplicationContext
16:39:19,298 INFO [org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext] (ServerService Thread Pool -- 14) Root WebApplicationContext: initialization completed in 538 ms
16:39:19,737 WARN [org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration] (ServerService Thread Pool -- 14)
build.gradle
dependencies {
// For JSP
providedCompile 'org.apache.tomcat.embed:tomcat-embed-jasper'
providedCompile 'javax.servlet:jstl:1.2'
providedCompile 'javax.servlet:javax.servlet-api'
implementation 'org.springframework.boot:spring-boot-starter-web'
providedCompile 'org.springframework.boot:spring-boot-starter-tomcat'
}
'Web Programming > springboot' 카테고리의 다른 글
Gradle에서 JavaDoc생성시 한글깨짐 문제 (0) | 2023.03.17 |
---|---|
Springboot 콘솔 배너 변경하기 ( 배너 생성 사이트 소개 ) (0) | 2022.07.25 |
문제해결: Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut (0) | 2022.07.05 |
Spring - AOP 기본개념 및 주요 기능, 예제와 함께 이해하기 (0) | 2022.06.28 |
VS Code에서 Spring실행 시 자바 옵션 전달하기(Java heap size 변경) (0) | 2022.06.23 |