인텔리제이(IntelliJ)나 로컬 PC 이클립스 환경에서 잘 동작하던 Maven 프로젝트를 압축하여 폐쇄망 PC로 들고 오거나 패키지.zip으로 통째로 말아 이동했을 때, 구동 시 원본 PC의 C드라이브 절대 경로를 찾으면서 ClassNotFoundException이나 빌드 에러가 발생하는 현상이 있습니다.

pom.xml 내부의 경로를 아무리 수정해도 특정 jar가 이전 개발 PC의 경로를 따라가는 원인과, 이를 근본적으로 해결하는 방법을 정리합니다.

1. 현상 및 원인 분석

❓ 원인: .factorypath 파일과 Enable project specific settings

프로젝트 루트 폴더를 확인해 보면 .factorypath라는 이클립스 전용 XML 설정 파일이 존재하는 경우가 많습니다.

<!-- .factorypath 파일 예시 -->
<factorypath>
    <factorypathentry kind="EXTJAR" id="C:\Users\User\.m2\repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar" enabled="true" runInBatchMode="false"/>
</factorypath>

이 파일 내부에는 위와 같이 개발 PC의 로컬 메이븐 리포지토리(C:\Users\계정명\.m2\...) 절대 경로가 하드코딩되어 들어갑니다.

이 파일이 생기는 메커니즘

  1. 이클립스 기본 상태에서는 이 기능이 꺼져(Off) 있습니다.
  2. 하지만 pom.xml에 Lombok, MapStruct, QueryDSL 등 아노테이션 프로세서(Annotation Processor) 관련 라이브러리가 포함된 상태로 프로젝트를 Import하면, 이클립스(m2e 플러그인)가 프로젝트의 Annotation Processing > Enable project specific settings 옵션을 자동으로 활성화(On)시킵니다.
  3. 그 순간 이클립스가 IDE 차원에서 아노테이션을 처리해주기 위해 현재 PC의 jar 경로를 읽어 .factorypath 파일에 기록하게 됩니다.
  4. 이 상태로 프로젝트 전체(또는 이클립스 JDT가 컴파일한 결과)를 폐쇄망으로 들고 가면, 폐쇄망 PC에는 해당 C드라이브 경로가 존재하지 않아 구동 실패 및 에러가 발생하게 됩니다.

 

2. 해결 방법: Maven 표준 빌드로 원복하기

이클립스 JDT 컴파일러의 개입을 막고 Maven 표준 빌드가 순수하게 라이브러리를 제어하도록 설정해야 합니다.

Step 1. 패키지 시 무조건 이클립스 Annotation Processing 설정 해제 (Off)

  1. 이클립스에서 프로젝트 마우스 우클릭 > Properties 진입
  2. 좌측 메뉴: Java Compiler > Annotation Processing 선택
  3. 우측 상단 Enable project specific settings 체크 해제 (Off)
  4. 하위 메뉴인 Factory Path에서도 동일하게 체크 해제 (Off) 후 Apply and Close 클릭

Step 2. 잔재 설정 파일 삭제 (중요)

설정을 해제했더라도 기존에 생성된 절대 경로 파일이 남아있으면 안 됩니다.

프로젝트 폴더(또는 이클립스 Explorer)에서 아래 파일/폴더를 직접 삭제해 줍니다.

  • .factorypath (가장 중요: 원본 PC 경로 저장 파일)
  • target/ 폴더 (기존 빌드 잔재 삭제)

 

Step 3. Maven 패키징 재실행

package -DskipTests
  1. Offline 체크 > Run 실행 > 하단 Console에 BUILD SUCCESS 확인
  2. 프로젝트 내 target/ 폴더에 생성된 결과물을 폐쇄망 서버에서 구동시킵니다.

 

3. 한 줄 요약

폐쇄망 전송 전 Enable project specific settings 해제(Off) 및 .factorypath 파일 삭제를 습관화하면 환경 이동 시 발생하는 빌드 경로 문제를 깔끔하게 예방할 수 있습니다. 이걸 몰라서 몇시간이나 시간을 소요했습니다 ,..

+ Recent posts