코딩마을방범대

WAR 파일을 이용해 Intellij 디버깅 모드로 실행시키기 본문

💡 백엔드/Java

WAR 파일을 이용해 Intellij 디버깅 모드로 실행시키기

신짱구 5세 2024. 5. 8. 16:58
728x90

 

 

war 파일을 실행시킬 땐 일반적으로 java -jar 명령어를 이용한다.

하지만 디버깅 모드가 필요할 경우 war가 아닌 프로젝트 소스 코드가 필요하다.

소스 코드를 확인하는 방법부터 프로젝트로 생성하는 방법까지 진행해볼 예정이다.

(디컴파일 시 빌드 파일은 확인이 불가하므로, 정확한 프로젝트 복구는 불가하다.)

 

 

 

 

WAR 파일의 소스 코드 추출하기

 

war 파일의 소스 코드를 확인하는 방법에는 여러가지가 있다.

 

1. war 파일의 확장자를 zip 파일로 변경해준 뒤 압축 해제

 

압축 해제 시 WEB-INF 폴더에 필요한 파일들이 들어가 있었다.

classes에는 실질적인 프로젝트 소스들이 들어가있고, lib에는 필요한 라이브러리들이 jar 파일로 들어있다.

하지만 이와 같이 소스 코드를 얻을 경우 파일명.class로 저장되기 때문에 intellij 실행을 위한 java 파일로 변환해주는 작업이 필요하다.

 

* class -> java 파일로 변환하기

https://github.com/leibnitz27/cfr
위 링크에 접속하여 jar 파일을 다운로드 받는다.

이 후,
java -jar cfr.jar 파일명.class --outputdir 폴더명
명령어를 통해 java 파일로 변환해준다.

 

 


 

 

 

2. JD-GUI 를 이용

 

디컴파일 프로그램으로 유명한 JD-GUI를 통해 java 파일로서의 추출이 가능하다.

우선 아래 페이지에서 jd-gui.jar 파일을 설치해준다.

 

Java Decompiler

The “Java Decompiler project” aims to develop tools in order to decompile and analyze Java 5 “byte code” and the later versions. JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files. You can browse the reco

java-decompiler.github.io

 

이후, java -jar jd-gui.jar 명령어를 통해 실행시켜주면 gui 화면이 나타난다.

war 파일을 드래그앤드롭 하여 실행시켜주면 디컴파일된 소스들 확인이 가능하다.

이 때 Ctrl + Alt + S 를 통해 모든 소스 저장 작업을 실행해준다.

 

시간이 조금 걸리는 작업을 기다린 뒤 확인해보면 .class 파일이 아닌 .java 파일로 저장된 소스들을 확인할 수 있다.

 

 

 

 

 

 


 

 

 

 

 

 

추출된 소스 코드로 프로젝트 실행하기

 

추출된 소스 코드로 프로젝트를 실행하려면 pom.xml 또는 build.gradle과 같은 파일이 필요하다.

하지만 앞서 말했듯이 war 를 디컴파일 시 빌드 파일 확인이 불가하다.

때문에 빌드 파일은 최소한의 설정만 적용시키고 구동이 되는 것에 초점을 둘 예정이다.

 

 

1. Intellj에서 new 프로젝트 생성하기

 

설정은 기존 프로젝트와 호환이 될 수 있다는 가정 하에서 자유롭게 설정해준다.

 

 


 

 

 

2. 디컴파일하여 저장한 소스 파일을 새로 생성한 프로젝트의 src/main/java 폴더에 넣어준다.

 

패키지명은 디컴파일한 소스를 기준으로 적용시켜준다.

 

 


 

 

3. 라이브러리들을 추가해준다.

 

build.gradle, pom.xml 등 파일 확인이 불가하므로, 라이브러리를 직접 추가해준다.

디컴파일 하여 저장한 폴더를 보면, WEB-INF/lib 에 라이브러리들이 .jar 파일로 저장되어있다.

Intellij에서 Ctrl + Alt + Shift + S 를 눌러준 뒤 라이브러리 탭에서 + 버튼을 클릭하여 라이브러리가 있는 폴더를 선택해준다.

 

 

 

 

 

 


 

 

 

 

 

 

새 프로젝트를 생성하여 디컴파일 소스 적용 시 주의할 점

 

 

1. build.gradle 파일 확인

 

우선, build.gradle 파일의 버전들을 잘 확인해줘야 한다.

java 버전 별로 spring 버전이 호환되는 범위가 다르니 유의해서 설정해주어야 한다.

 

 

 


 

 

2. Project Structure 확인

 

Ctrl + Alt + Shift + S 를 누른 뒤 뜨는 창에서의 Java 버전과 gradle에 기입된 Java 버전이 일치해야한다.

 

 

 


 

 

3. gradle-wrapper.properties 확인

 

프로젝트 내의 gradle 폴더에 gradle-wrapper.properties 파일을 확인해보면, distributionUrl 라는 항목이 있다.

gradle의 버전도 java 버전과 맞게 설정해주어야 오류가 발생하지 않는다.

 

 

 

위 버전을 제대로 맞춰주지 않을 경우 아래 오류가 발생할 수 있다.

Unable to find method 'org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact.<init>(Lorg/gradle/api/tasks/bundling/AbstractArchiveTask;)V'
org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact.<init>(Lorg/gradle/api/tasks/bundling/AbstractArchiveTask;)V

Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)

 

 


 

 

4. java 파일의 패키지명 확인

 

Ctrl + Shift + F 를 통해 WEB-INF.classes. 를 공백으로 변경해준다.

 

 

 

 


 

 

5. import 확인

 

import가 제대로 되어있지 않아 오류가 발생할 수 있다.

이럴 경우 intellij의 Auto import를 이용해 간편하게 import 시킬 수 있다.

 

Ctrl + Alt + S 를 클릭하여 Intellij 설정창을 띄운다.

이 후, Editor - General - Auto Import 탭으로 이동한다.

Optimize imports on the fly (for current project)와 Add unambiguous imports on the fly 옵션을 체크한다.

 

 

728x90