카테고리 없음

jar option (jar 압축/해제 - cmd, batch, java)

dddzr 2022. 6. 15. 23:45

명령어 옵션

사용법: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
옵션:
    -c  새 아카이브를 생성합니다.
    -t  아카이브에 대한 목차를 나열합니다.
    -x  명명된(또는 모든) 파일을 아카이브에서 추출합니다.
    -u  기존 아카이브를 업데이트합니다.
    -v  표준 출력에 상세 정보 출력을 생성합니다.
    -f  아카이브 파일 이름을 지정합니다.
    -m  지정된 Manifest 파일의 Manifest 정보를 포함합니다.
    -n  새 아카이브를 생성한 후 Pack200 정규화를 수행합니다.
    -e  jar 실행 파일에 번들로 제공된 독립형 애플리케이션의
        애플리케이션 시작 지점을 지정합니다.
    -0  저장 전용: ZIP 압축을 사용하지 않습니다.
    -P  파일 이름에서 선행 '/'(절대 경로) 및 ".."(상위 디렉토리) 구성요소를 유지합니다.
    -M  항목에 대해 Manifest 파일을 생성하지 않습니다.
    -i  지정된 jar 파일에 대한 인덱스 정보를 생성합니다.
    -C  지정된 디렉토리로 변경하고 다음 파일을 포함합니다.
특정 파일이 디렉토리일 경우 순환적으로 처리됩니다.
Manifest 파일 이름, 아카이브 파일 이름 및 시작 지점 이름은
'm', 'f' 및 'e' 플래그와 동일한 순서로 지정됩니다.

예 1: classes.jar라는 아카이브에 두 클래스 파일을 아카이브하는 방법:
       jar cvf classes.jar Foo.class Bar.class
예 2: 기존 Manifest 파일 'mymanifest'를 사용하여
           foo/ 디렉토리의 모든 파일을 'classes.jar'로 아카이브하는 방법:
       jar cvfm classes.jar mymanifest -C foo/ .

 

실행 방법

1. cmd

생성

jar.exe파일의 경로먼저 써주고 옵션실행, 본인 jdk버전 확인할 것

D:\{forderPath}>"C:\Program Files\Java\jdk1.8.0_161\bin\jar.exe" -cvfM {NewName}.jar *
또는
D:\{forderPath}>"C:\Program Files\Java\jdk1.8.0_161\bin\jar.exe" -cvfM D:\{forderPath}\{NewName}.jar *
또는
D:\{forderPath}>jar -cvfM {NewName}.jar * //JAVAHOME PATH 지정시 바로 jar 명령어 사용가능
  • 여기까지 쓰면 압축할 forderpath의 전체(*)가 NewName.jar로 묶임
  • 만약 {NewName}.war이라고 하면 war로 묶임
  • 만약 *.class라고 하면 확장자가 .class인 파일만 묶임
  • jar파일 생성위치는 D:\{forderPath}로 내용물?class의 위치와 같음
  • 대문자 M은 mainfest 파일 생성 안하는 옵션인데 jar파일을 다시 풀어서 사용하려고 할때 META-INF안생기게 하려면 지정해워야 하는 것 같다

 

D:\{forderPath}>"C:\Program Files\Java\jdk1.8.0_161\bin\jar.exe" -cvfM {NewName}.jar -C {forderPath이후의 경로}\ .
  • -C옵션으로 폴더 내부로 들어감 \ .은 그안의 모든파일을 묶는다는 뜻
  • -C옵션 안에서는 *.class처럼 특정 파일확장자 지정 못 하는 듯

 

추출

D:\{forderPath}>"C:\Program Files\Java\jdk1.8.0_161\bin\jar.exe" -xvfM {NewName}.jar

 

 

2.  JAVA

Command 직접실행

    public int jarToClass(String filePath) throws IOException{//filePath: jarFileName.jar 형태
        String javaBinPath = "\"C:\\Program Files\\Java\\jdk1.8.0_161\\bin\\";
        String jarCommand = javaBinPath + "jar.exe\" -xvfM " + filePath;
        Runtime rt = Runtime.getRuntime();
        Process pro;  
        try {
            pro = rt.exec(jarCommand);
            pro.waitFor();
            File jarFile = new File(filePath);
            jarFile.delete();
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

 

batch파일 생성 후 실행

    public int jarToClass(String filePath, String fileName) throws IOException{
        File BatFile = new File(filePath + "batName.bat");
        BufferedWriter xfbufferedWriter = new BufferedWriter(new FileWriter(BatFile, false));
        String batStr = "@echo off \n";
        batStr += "pushd \"%~dp0\"\n";
        batStr += "cd " + filePath + "\n"; //bat파일위치와 file위치가 같으면 생략가능
        batStr += "setlocal\n";
        batStr += "set jarFile=jar xvfM " + fileName + ".jar *\n"; //변수
        batStr += "%jarFile%\n";
        bufferedWriter.write(batStr);
        bufferedWriter.flush();
        bufferedWriter.close();

        Runtime rt = Runtime.getRuntime();
        Process pro;
        String BatchFilePath = filePath + "batName.bat";
        try {
            pro = rt.exec(BatchFilePath);
            pro.waitFor();

            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }