제목이 좀 이상하지만, 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 |