본문 바로가기

WAS/JBoss&WildFly

jboss-deployment-structure.xml <exclusions> 사용 해보기

728x90

제목이 좀 이상하지만,  jboss-deployment-structure.xml 작성 여부에 따라

어떤 클래스 파일을 로드하는지를 JSP 페이지를 통해서 확인하고자 한다.

 

global 모듈 같은 등록 작업은 왜 해야하는지 알게 되면 수정토록 하겠습니다.

일단 GPT 통해서 소스코드 및 xml 파일 수정이 들어갔음을 말씀드립니다.

 

사실 이 글을 작성하는 최대 목적은 jboss의 라이브러리와 APP의 라이브러리가 충돌했을 때

어떻게 해야 APP의 라이브러리를 우선시 할 수 있는지 알아보고자 정리하는 것이다.

 

1. 작업 디렉토리 구성

mkdir -p ~/dupe-test/{server-src,web-src,build}
cd ~/dupe-test

 

2. JBoss 엔진 단에 위치시킬 Java 코드 작성

cd server-src
mkdir -p com/example/dupe
vi com/example/dupe/VersionPrinter.java

package com.example.dupe;

public class VersionPrinter {
    public static String whoAmI() {
        return "SERVER MODULE VERSION";
    }
}

 

3. 컴파일 및 JBoss 엔진 단에 올릴 jar 생성

cd ~/dupe-test

# 컴파일
javac -d build server-src/com/example/dupe/VersionPrinter.java

# jar 생성
jar cf dupe-server.jar -C build .

 

4. WEB-INF/lib용 Java 작성

cd ~/dupe-test/web-src
mkdir -p com/example/dupe
vi com/example/dupe/VersionPrinter.java

package com.example.dupe;

public class VersionPrinter {
    public static String whoAmI() {
        return "WEB-INF/LIB VERSION";
    }
}

 

5. 컴파일 및 WEB-INF/lib에 위치시킬 jar 생성

cd ~/dupe-test

# build 초기화
rm -rf build/*
mkdir -p build

# 컴파일
javac -d build web-src/com/example/dupe/VersionPrinter.java

# jar 생성
jar cf dupe-web.jar -C build .

 

6. 생성한 jar 파일을 JBoss의 모듈에 등록

mkdir -p $JBOSS_HOME/modules/com/example/dupe/main
내 환경은 /sw/jboss-eap-7.4/modules 경로에 com/example/dupe/main을 생성

 

7. 엔진에 올리 jar 파일을 6. 에서 생성한 경로로 복사

cp dupe-server.jar $JBOSS_HOME/modules/com/example/dupe/main/

 

8.$JBOSS_HOME/modules/com/example/dupe/main 경로에 module.xml 작성

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.9" name="com.example.dupe">
    <resources>
        <resource-root path="dupe-server.jar"/>
    </resources>
</module>

 

9. JBoss 인스턴스 동작 시 사용하는 configuration 파일(ex. standalone.xml 혹은 standalone-ha.xml)에 global module 작성

 

<subsystem xmlns="urn:jboss:domain:ee:4.0">
    <global-modules>
        <module name="com.example.dupe" slot="main"/>
    </global-modules>
    
    ... 이하 내용 생략 ...
    
</subsystem>

 

10. WEB-INF/lib에 위치시키려던 jar를 카피

cp dupe-web.jar testapp/WEB-INF/lib/

 

11. jsp 작성

<%@ page import="com.example.dupe.VersionPrinter" %>
<%@ page import="java.net.URL" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%
    String result = VersionPrinter.whoAmI();

    Class<?> clazz = VersionPrinter.class;
    ClassLoader cl = clazz.getClassLoader();
    URL location = clazz.getProtectionDomain().getCodeSource() != null
            ? clazz.getProtectionDomain().getCodeSource().getLocation()
            : null;
%>
<html>
<body>
<h2>Class Loading Test</h2>

<p>Result: <b><%= result %></b></p>
<p>ClassLoader: <%= cl %></p>
<p>Loaded From: <%= (location != null ? location.toString() : "unknown") %></p>

</body>
</html>

 

애플리케이션을 배포한 뒤에 테스트를 진행

 

Case 1. jboss-deployment-structure.xml에 아무런 설정이 없는 아래와 같을 때.

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment/>
</jboss-deployment-structure>

 

 

 

Case 2. jboss-deployment-structure.xml에 중복이 되는 패키지 경로(com.example.dupe)를 설정한 아래와 같을 때.

 

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>
            <module name="com.example.dupe"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

 

 

 

 

두 개를 같이 보면 이렇다

 

case 2. 의 내용은 특정 클래스를 제외하는것이 아닌,

모듈 전체를 classpath에 제거하는 것이라 생각하자.

 

 com.example.dupe.* 에 대한 모든 것이 deployment에서 안 보이게 되는 것이다.

그리고 서버 모듈이 제거되니까 결과적으로 WEB-INF/lib가 선택된 것이다.

'WAS > JBoss&WildFly' 카테고리의 다른 글

JBoss 배포 cli command  (0) 2026.04.09
jboss - cubrid 연동  (0) 2026.04.03
log4j 설정 관련 추가 정리  (0) 2026.03.24
http method 제한  (0) 2026.03.16
Session Timeout 설정  (0) 2026.03.16