명령어 옵션
사용법: 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;
}
}