BBClassMerge : 자바 클래스 머지를 위한 폴더용 디컴파일러

BBClassMerge : 자바 클래스 머지를 위한 폴더용 디컴파일러

2018년 9월 26일에 업로드했던 BBDirDecompiler(폴더용 자바 디컴파일러)를 발전시킨 프로그램이다.

classmerge 패키지와 diff 패키지로 구성되어 있는데, 크게 두 가지 프로그램이 합쳐져 있다고 보면 된다.

classmerge 패키지 쪽은 이번에 작성한 것이다.

diff 패키지 쪽은 2017년 1~2월에 작성했던 것을 코드 보완해서 녹인 것이다.

■ 다운로드

첨부파일 BBClassMerge_181022.zip 를 다운받으면 된다.

실행파일은 bin 폴더 안에 있으며, 소스파일은 sources 폴더 안에 있다.

■ 이 프로그램의 목적

class 파일들의 내용을 비교하고(Diff), 합치기(Merge) 위한 프로그램이다.

예를 들어 운영서버에 있는 class 파일들과 로컬에 있는 class 파일들이 서로 다를 때 사용할 수 있다.

■ 사용법

Left Classes Dir 이 기준이 되는 폴더위치다.

예컨대 Left Classes Dir 에 운영서버의 classes 파일이 들어있는 폴더 경로를 입력하면 된다.

Right Classes Dir 은 비교를 위한 폴더위치다.

정확히 표현하면, 현재 갖고 있는 자바 소스가 Right Classes Dir 인데, 궁극적으로 Left Classes Dir 의 소스 코드로 만들고자 할 때 이 프로그램을 사용하면 된다.

1. Decompile 버튼

Left Classes Dir 폴더 내의 class 파일들과, Right Classes Dir 폴더 내의 클래스 파일들을 폴더째 디컴파일한다.

확장자가 class 인 파일들만 처리한다.

최종적으로 2개 폴더가 생성된다.

하나는 Left Classes Dir 폴더를 디컴파일한 결과고, 다른 하나는 Right Classes Dir 폴더를 디컴파일한 결과다.

2. Merge 버튼

Left Classes Dir 폴더 내의 class 파일들과, Right Classes Dir 폴더 내의 클래스 파일들을 머지하기 위한 기능이다.

Right Classes Dir 폴더를 Left Classes Dir 폴더에 가깝게 만들기 위한 기능이다.

2-1. Left Classes Dir 폴더 내에만 존재하는 파일 : 복사한다. (클래스라면 디컴파일해서 복사한다.)

2-2. Right Classes Dir 폴더 내에만 존재하는 파일 : 무시한다. (복사하지 않는다)

2-3. Left Classes Dir 폴더 와 Right Classes Dir 폴더 양쪽에 존재하는 파일 : 두 개 파일을 비교해서, 동일할 경우 무시한다. 상이할 경우 Left Classes Dir 폴더 쪽의 파일을 복사한다. (클래스라면 디컴파일해서 복사한다.)

최종적으로 1개 폴더가 생성된다.

이 결과 폴더를 Right Classes Dir 폴더에 해당되는 자바 소스에 덮어쓰기하면, 궁극적으로 Left Classes Dir 의 소스 코드에 가까워진다.

[같아진다]가 아니라 굳이 [가까워진다]라고 표현한 것은, 아무래도 몇 가지 예외 케이스가 있기 때문이다.

* 예외 케이스

동봉된 jad 디컴파일러의 문제로 디컴파일된 내용에 어셈블리어가 섞여나오는 경우가 있다. 100% 온전하게 디컴파일되지 않는다. 이 경우 소스가 잘 돌아가도록 일일히 수정해줘야 한다.

3. Diff 버튼
Left Classes Dir 폴더 내의 class 파일들과, Right Classes Dir 폴더 내의 클래스 파일들을 비교하기(Diff) 위한 기능이다.

Diff 툴로써의 기능은 떨어지지만, 특장점이 두 가지 있다.

첫번째 장점은 좌측에 폴더 트리를 제공한다는 점이다.

Left Classes Dir 폴더에만 존재하는 파일은 [Left]라고 표시되고, Right Classes Dir 폴더에만 존재하는 파일은 [Right]라고 표시된다.

양쪽 모두에 존재하는 파일은 파일용량 차이가 [용량차이 숫자값]으로 표시된다.

용량 차이가 없을 경우 [0]이라고 표시될 것이다.

두번째 장점은 class 파일을 곧바로 비교할 수 있다는 점이다.

트리 상의 파일을 더블클릭했을 때 class 파일인 경우, 양쪽 파일을 곧바로 decompile 해서 diff하고 상이한 부분을 하이라이트 처리한다.

참고사항. class 파일의 비교

다른 파일들도 그렇지만, class 파일은 용량이 같다고 해서 동일하다고 볼 수는 없다.

텍스트 파일도 글자수가 같으면 용량이 같지만, 내용이 다른 경우가 있듯이 말이다.

문제는 class 파일은 용량이 다르다고 해서 상이하다고 볼 수도 없다.

일반적으로는 용량이 다르면 상이한 파일이라고 볼 수 있는데, class 파일은 디컴파일 해놓고 보면 동일한 내용인 경우가 있다.

버전 등 컴파일러가 다를 경우 class 파일의 용량과 내용이 조금 다를 수 있기 때문이다.

따라서 본 프로그램에서는 Merge 버튼으로 class 파일을 비교할 때, 우선 디컴파일 하지 않은 상태에서 용량과 내용이 동일한지 검사하고, 이어서 디컴파일한 상태에서 용량과 내용이 동일한지까지 검사한다.