자바 카페에서 아래와 같은 질문이 올라왔다.
질문
이클립스에서는 아래와 같이 프로젝트에서 Export로 Runnable JAR 파일을 만들수가 있습니다.
이것을 CMD 창에서 만드려면 어떤 명령어를 입력해야 하나요?
라이브러리 JAR도 포함시킬 때 추가 명령어 입력하는 부분도 궁금합니다.
생성된 JAR 파일에는 META-INF가 자동으로 포함되어 있는데요, CMD 상에서 JAR 파일 만들때에는 MAINFEST.MF 파일이 반드시 있어야 하나요?
느낌은...
일단 질문 자체를 듣고 느낀 점은 IDE의 장점이자 단점을 느낄 수 있었다.
통합개발도구(IDE)는 개발시에 코드입력 뿐만 아니라 컴파일 등의 반복적으로 하는 것과 디버깅, 리팩토링 등 여러가지를 도와준다.
만약 자바를 명령어부터 시작했더라면 컴파일 되는 과정이 javac 라는 명령어로 가능하다는 것과 실행시 java 명령어로 가능하다는 것이다.
물론 IDE는 명령어로 이 작업을 할 수도 있고 다른 방법으로도 수행할 수 있다.
마찬가지로 JAR 파일을 만드는 것 역시 jar 라는 JDK에 포함되어 있는 명령어 도구로 가능하다.
결국은 IDE로 할 수 있는 것은 커맨드라인으로 할 수 있다.
첫 번째 답변
일단 jdk를 설치하면 jar라는 명령을 수행할 수 있습니다. 이걸으로 jar 파일을 만들 수 있습니다.
runnable jar라는 것은 결국 실행할 main 메서드가 있는 클래스를 지정해주는 것을 추가해주면 되는데 MANIFEST.MF 파일에 Main-Class 로 지정을 해주면 됩니다.
자세한 것은 jar command 레퍼런스를 참고하세요.
https://docs.oracle.com/en/java/javase/15/docs/specs/man/jar.html
~~~
사실 더 세밀하게 답변을 할 수도 있었지만 레퍼런스 문서를 보는 습관을 들여야 스스로 답을 찾아 갈 수 있어서 대략적인 내용으로 설명을 했고, 레퍼런스 링크까지 찾아서 붙였다.
추가 질문
그럼 이클립스에서 생성하는 것은 MANIFEST.MF 파일을 임시로 생성했다가 JAR 파일이 만들어지면 다시 삭제하는 건가요?
답변을 하려면...
답변을 하려면 어떤 정보가 있어야 할까?
만들어진 jar 파일의 압축을 풀어보면 MANIFEST.MF 파일이 들어있고 만약 Launch configuration으로 main 함수가 있는 클래스가 지정이 되어 있다면 MANIFEST.MF 파일에 Main-Class 및 Class-Path 부분의 값이 지정된다.
하지만 이것은 결과적으로 추적한 동작에 대한 추정이지 실제 이클립스가 어떻게 jar 파일을 만드는지는 알 수 없다.
이클립스 프로젝트가 오픈소스이니까...
이클립스는 오프소스 프로젝트이다.
그말은 소스코드가 공개되어 있다는 것이다.
동작을 확인하기 위해서는 소스코드를 확인해보면 된다.
eclipse 여러가지 핵심 모듈과 끼어넣을 수 있는 플러그인식으로 되어 있다.
따라서 해당 기능을 알기 위해서는 어떤 모듈에 그 기능을 하고 있는지를 알아야 한다.
제일 왼쪽의 아이콘을 눌러보면 아래와 같은 창이 뜬다.
Eclipse Java Delopment Tools 라는 기능 이름이 있는데 Feature Id 가 jdt 이다.
결국 jdt 프로젝트 하위에 해당 기능을 구현하고 있음을 알 수 있다.
eclipse.jdt
GitHub에서 jdt 리포지토리를 찾아보면 몇 가지로 나뉘어 있음을 알 수 있다.
이중 Jar로 추출하는 화면으로 어떤 코드가 수행하는지 따라가 볼 수 있을 것이다.
Runnable JAR File Export 창은 아래와 같다.
이중 질문자가 물어보는 부분은 Launch configuration 쪽에서 선택하는 영역이다.
UI 부분은 eclipse.jdt.ui 에 코드가 있다.
위의 창은 마법사 페이지인데, 이름이 FatJarPackageWizardPage 이다.
참고로 이클립스는 SWT(The Standard Widget Toolkit)이라는 것을 사용하고 있다.
일단은 여기부터 코드를 따라가보면 이클립스가 어떤 동작을 하고 있는지 따라갈 수 있을 것이다.
Good luck~!
'Programing > OpenSource' 카테고리의 다른 글
Electron ≥ 12.x : 컨텍스트 분리(Context Isolation) (0) | 2021.11.14 |
---|---|
Mockito use case (0) | 2021.04.08 |
[Lombok & Spring (Jackson)] @Getter(lazy=true)를 쓸 때 주의해야 할 점 (0) | 2020.11.18 |
[tomcat] 적어도 하나의 JAR가 TLD들을 찾기 위해 스캔되었으나 아무 것도 찾지 못했습니다. (0) | 2020.11.13 |
[tomcat] ARP 경고 해결하기 (0) | 2020.11.13 |