본문 바로가기
language/Java

[Java] Compile과 Decompile (feat. .JAR, .WAR, .class, .java) + JAD

by 스파이디웹 2023. 2. 17.
728x90

이번 포스트에는 Java 언어의 특징인  Compile과 그의 반댓말인 Decompile, 그리고 관련된 파일형식 및 도구에 대해 정리해보겠습니다.

 

1.  Compile이란?

1) 정의

사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어 주는 과정

컴퓨터는 0과 1로만 모든 명령을 이해하고 실행하기 때문에, 인간의 언어를 기계가 알아 들을 수 있게 바꿔주는 작업이 필요함.

  • Compiler(compile + link)
  • compile: 원시코드에서 목적코드(목적파일)로 바꾸어 주는 것
  • link : 목적 파일을 실행 파일로 바꾸는 것
  • 원시코드: 인간이 알아볼 수 있는, 우리가 작성한 코드(.java)
  • 목적코드: 컴퓨터가 이해할 수 있도록 번역한 코드(기계어)(.class)

 

2) compile을 과정이 필요한 이유

  1. JVM은 byte code(.class 파일)을 실행할 때 compile 과정에서 진행 한 일을 다시 진행하지 않고, 실행만 함
  2. 매번 소스코드 문법검사를 하지 않고 불필요한 작업을 줄였기 때문에, 빠름
  3. 기업 내의 코드를 사람이 읽을 수 없는 코드로 변환하여 외부로 부터 코드자산을 지키는 의미도 있음
바이트 코드(Byte Code) : JVM 이 이해할 수있는 0과 1로 구성된 이진 코드(Binary Code)
Native Machine Code : 기계어, 컴퓨터가 이해할 수 있는 0과 1로 구성된 이진 코드(Binary Code)

2.  .class vs .java

1) .java

사람이 알아볼 수 있는 JAVA언어로 적은 source code 파일, 기계는 .java코드를 읽을 수 없으며, 컴파일을해서 기계가 읽을 수 있는 기계어로 변환해야 한다.

2) .class

source code인 .JAVA 파일을 JAVA Compiler를 통해 기계가 알아 들을 수 있는 byte code(target code)로 변환한 파일

3) .JAVA → .class

$ javac 디렉토리/파일명.java

4) .class 파일 실행

$ java 클래스파일명.class

 


3.  .JAR vs .WAR

기본적으로 JAR, WAR 모두 Java의 jar 옵션 (java -jar)을 이용해 생성된 압축(아카이브) 파일로, 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성 파일 등)을 패키징 한 것

1) JAR (Java Archive)

  • JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
  • Class (JAVA리소스, 속성 파일), 라이브러리 파일을 포함함
  • JRE(JAVA Runtime Environment)만 있어도 실행 가능함 (java -jar 프로젝트네임.jar)
  • Spring boot에서는 JSP, 외장 톰캣을 사용하지 않으므로 JAR가 표준

2) WAR (Web Application Archive)

  • Servlet / Jsp 컨테이너에 배치할 수 있는 웹 애플리케이션(Web Application) 압축파일 포맷
  • 웹 관련 자원을 포함함 (JSP, Servlet, JAR, Class, XML, HTML, Javascript)
  • 사전 정의된 구조를 사용함 (WEB-INF, META-INF)
  • 별도의 웹서버(WEB) or 웹 컨테이너(WAS) 필요
  • 즉, JAR파일의 일종으로 웹 애플리케이션 전체를 패키징 하기 위한 JAR 파일


4. .java vs .JAR

.jar 파일은 하나 이상의 Java 클래스 파일을 포함하는 Zip 아카이브

  • 라이브러리(여러 클래스로 구성됨)를 보다 편리하게 사용할 수 있음
  • 디렉토리 및 .jar 파일이 클래스 경로에 추가되고, 런타임 시 ClassLoader에서 사용 가능하여 내부의 특정 클래스를 찾을 수 있음

5. Decompile이란?

컴파일과는 반대로, 컴파일된 실행 파일을 소스코드로 되돌리는 작업(reverse engineering)이라고도 불림
실행파일에 대해서 소스코드를 보고 싶을 때 사용

6.  JAD(Java Decompiler)란?

.JAR 안의 .class파일의 코드를 decompile하여 .java 소스코드로 변환시켜주는 도구

즉, 기계어를 인간이 볼 수 있는 코드로 변환시키는 방법을 지원하는 도구


1) JAD 다운로드

아래의 링크에서 jad 다운

https://varaneckas.com/jad/


2) JAD 실행

CMD(명령프롬프트) 실행

# jad.exe가 있는 디렉토리로 이동
cd 'jad.exe가 있는 디렉토리 위치'

jad 명령어

jad -sjava 파일이름.class

실습

jad -sjava ReqValidator.class

 

자주 쓰이는 옵션 정리

  • -o: overwrite
  • -sjava: .class → .java 파일로 변환 (-s java로 적어도 가능)
  • -d외부디렉토리: 변환된 파일이 생성될 디렉토리 지정 (-d 외부디렉토리로 적어도 가능)

이외의 옵션 정리

Jad accepts the following options:

   -a       - annotate the output with JVM bytecodes (default: off)
   -af      - same as -a, but output fully qualified names when annotating
   -clear   - clear all prefixes, including the default ones (can be abbreviated as -cl)
   -b       - output redundant braces (e.g., if(a) { b(); }, default: off)
   -d <dir> - directory for output files (will be created when necessary)
   -dead    - try to decompile dead parts of code (if any) (default: off)
   -disass  - disassemble method bytecodes (no JAVA source generated)
   -f       - output fully qualified names for classes/fields/methods (default: off)
   -ff      - output class fields before methods (default: after methods)
   -i       - output default initializers for all non-final fields
   -l<num>  - split strings into pieces of maximum <num> chars (default: off)
   -lnc     - annotate the output with line numbers (default: off)
   -lradix<num> - display long integers using the specified radix (8, 10 or 16)
   -nl      - split strings on newline character (default: off)
   -nocast  - don't generate auxiliary casts
   -nocode  - don't generate the source code for methods
   -noconv  - don't convert Java identifiers (default: convert)
   -noctor  - suppress the empty constructors
   -nodos   - do not check for class files written in DOS mode (CR before NL, default: check)
   -nofd    - don't disambiguate fields with the same names by adding signatures to their names (default: do)
   -noinner - turn off the support of inner classes (default: on)
   -nolvt   - ignore Local Variable Table information
   -nonlb   - don't output a newline before opening brace (default: do)
   -o       - overwrite output files without confirmation (default: off)
   -p       - send decompiled code to STDOUT (e.g., for piping)
   -pi<num> - pack imports into one line after <num> imports (default: 3)
   -pv<num> - pack fields with identical types into one line (default: off)
   -pa <pfx>- prefix for all packages in generated source files
   -pc <pfx>- prefix for classes with numerical names (default: _cls)
   -pf <pfx>- prefix for fields with numerical names (default: _fld)
   -pe <pfx>- prefix for unused exception names (default: _ex)
   -pl <pfx>- prefix for locals with numerical names (default: _lcl)
   -pm <pfx>- prefix for methods with numerical names (default: _mth)
   -pp <pfx>- prefix for method parms with numerical names (default: _prm)
   -r       - restore package directory structrure
   -radix<num> - display integers using the specified radix (8, 10 or 16)
   -s <ext> - output file extension (by default '.jad')
   -safe    - generate additional casts to disambiguate methods/fields (default: off)
   -space   - output space between keyword (if/for/while/etc) and expression (default: off)
   -stat    - display the total number of processed classes/methods/fields
   -t       - use tabs instead of spaces for indentation
   -t<num>  - use <num> spaces for indentation (default: 4)
   -v       - display method names being decompiled
   -8       - convert UNICODE strings into 8-bit strings
              using the current ANSI code page (Win32 only)
   -&       - redirect STDERR to STDOUT (Win32 only)

All single-word options have three formats:

  -o    - 'reverses' value of an option
  -o+   - set value to 'true' or 'on'
  -o-   - set value to 'false' or 'off'


 

참조:

https://velog.io/@mooh2jj/JAR-vs-WAR-%EB%B0%B0%ED%8F%AC%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://javacpro.tistory.com/23

728x90

'language > Java' 카테고리의 다른 글

[Java] public static void main(String args[]){}란? 이유  (0) 2022.09.05
[Java] Guava란? Guava를 써야되는 이유  (0) 2021.05.09
캡슐화와 정보은닉  (0) 2020.06.09
자바의 기본구성2  (0) 2020.03.02
자바언어의 기본 구성  (1) 2020.02.28

댓글