Specification - The JAR File Specification
기본사항
옵션은 tar에서 쓰는 것과 같다. 기본으로 압축이 되니 z만 빠지고. 근데 그냥 쓰다보니 c가 create, f가 파일로 출력이라는 의미인지는 오늘에서야.. (먼 산) tf 하면 목록 리스팅이 되고 (t는 table of contents 약자였군) xf 쓸 때 특정 파일만 지정하면 그것만 빠진다. uf 쓰면 특정 파일을 업데이트 한다.
매니페스트
잘 보면 META-INF/MANIFEST.MF 파일이 추가되어 있다. (왜 다 대문자냐 -_-)
파일 내용을 보면 Manifest-Version하고 Created-By만 Key: Value 형식으로 써있다.
여기에 Main-Class: blah 써있는 경우 java -jar jarfile 하면 알아서 뒤져서 실행해준단다. Main-Class 박아넣으려면 jar 쓸 때 m 옵션 추가해서 저 설정 박힌 텍스트 파일을 지정하면 된다. 아.. entry point만 바꿀 것이면 e 옵션을 쓰면 된댄다. (JDK 6부터)
좀 주의할만한 것은 동일한 내용을 묶더라도 매번 jar 파일이 다르다는 것이다. 자동으로 타임스탬프가 박히기 때문에 완전히 같은게 아니다. 빌드 시스템 만들 때 단순히 jar 비교하면 삽질하겠네.
다른 JAR 파일의 리소스를 참조하려면 어떻게 해야되나? Manifest 파일에 Class-Path: 로 다른 jar 파일 이름을 나열해준다. (공백으로 연결)
스펙이나 버전 같은 정보를 Manifest 에 넣을 때는 아래 헤더 사용 (예시)
Name: java/util/
Specification-Title: Java Utility Classes
Specification-Version: 1.2
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: java.util
Implementation-Version: build57
Implementation-Vendor: Sun Microsystems, Inc.
위에서 보듯이 Name 패키지 이름은 반드시 /로 끝나야 함.
Sealed: true 쓰면 jar를 봉인할 수 있음.
가령 아래처럼 일일이 해도 되고 통짜로도 되고.
Name: myCompany/firstPackage/
Sealed: true
Name: myCompany/secondPackage/
Sealed: true
디지털 서명
배포자는 비밀키를 이용하여 JAR 파일에 서명. 대응되는 공개키와 관련된 인증서가 JAR 파일에 같이 들어감. 싸인하고 나면 META-INF에 확장자가 SF인 시그니처 파일이 생성되는데..
Signature-Version: 1.0
SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
Created-By: 1.6.0 (Sun Microsystems Inc.)
Name: test/classes/ClassOne.class
SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=
Name: test/classes/ClassTwo.class
SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=
뭐 이렇게 생겨서.. 각 파일별로 Digest 해시값 가지고 있고.. 매니페스트 자체가 바뀌지 않았는지 확인용으로 전체 Digest가 하나 더 있음. 여기에 추가로 시그니처 블록 파일도 추가되는데.. JAR 파일 검증용으로 비밀키 이용하여 생성한 시그니처랑 싸인한 사람 공개키를 담고 있는 인증서 내용이 박혀있음. 보통 확장자가 DSA.
공개키/비밀키 쌍이 홈 디렉터리 .keystore 파일에 저장되어 있다고 하고.. 실제 싸인은 jarsigner jar-file alias 이렇게.. alias는 인증서 별칭이 되겠는데 기본적으로는 여기서 8글자 따서 SF랑 DSA 파일 이름 짓는다. 검증할 때는 jarsigner -verify jar-file로 하면 됨.
기본사항
옵션은 tar에서 쓰는 것과 같다. 기본으로 압축이 되니 z만 빠지고. 근데 그냥 쓰다보니 c가 create, f가 파일로 출력이라는 의미인지는 오늘에서야.. (먼 산) tf 하면 목록 리스팅이 되고 (t는 table of contents 약자였군) xf 쓸 때 특정 파일만 지정하면 그것만 빠진다. uf 쓰면 특정 파일을 업데이트 한다.
매니페스트
잘 보면 META-INF/MANIFEST.MF 파일이 추가되어 있다. (왜 다 대문자냐 -_-)
파일 내용을 보면 Manifest-Version하고 Created-By만 Key: Value 형식으로 써있다.
여기에 Main-Class: blah 써있는 경우 java -jar jarfile 하면 알아서 뒤져서 실행해준단다. Main-Class 박아넣으려면 jar 쓸 때 m 옵션 추가해서 저 설정 박힌 텍스트 파일을 지정하면 된다. 아.. entry point만 바꿀 것이면 e 옵션을 쓰면 된댄다. (JDK 6부터)
좀 주의할만한 것은 동일한 내용을 묶더라도 매번 jar 파일이 다르다는 것이다. 자동으로 타임스탬프가 박히기 때문에 완전히 같은게 아니다. 빌드 시스템 만들 때 단순히 jar 비교하면 삽질하겠네.
다른 JAR 파일의 리소스를 참조하려면 어떻게 해야되나? Manifest 파일에 Class-Path: 로 다른 jar 파일 이름을 나열해준다. (공백으로 연결)
스펙이나 버전 같은 정보를 Manifest 에 넣을 때는 아래 헤더 사용 (예시)
Name: java/util/
Specification-Title: Java Utility Classes
Specification-Version: 1.2
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: java.util
Implementation-Version: build57
Implementation-Vendor: Sun Microsystems, Inc.
위에서 보듯이 Name 패키지 이름은 반드시 /로 끝나야 함.
Sealed: true 쓰면 jar를 봉인할 수 있음.
가령 아래처럼 일일이 해도 되고 통짜로도 되고.
Name: myCompany/firstPackage/
Sealed: true
Name: myCompany/secondPackage/
Sealed: true
디지털 서명
배포자는 비밀키를 이용하여 JAR 파일에 서명. 대응되는 공개키와 관련된 인증서가 JAR 파일에 같이 들어감. 싸인하고 나면 META-INF에 확장자가 SF인 시그니처 파일이 생성되는데..
Signature-Version: 1.0
SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
Created-By: 1.6.0 (Sun Microsystems Inc.)
Name: test/classes/ClassOne.class
SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=
Name: test/classes/ClassTwo.class
SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=
뭐 이렇게 생겨서.. 각 파일별로 Digest 해시값 가지고 있고.. 매니페스트 자체가 바뀌지 않았는지 확인용으로 전체 Digest가 하나 더 있음. 여기에 추가로 시그니처 블록 파일도 추가되는데.. JAR 파일 검증용으로 비밀키 이용하여 생성한 시그니처랑 싸인한 사람 공개키를 담고 있는 인증서 내용이 박혀있음. 보통 확장자가 DSA.
공개키/비밀키 쌍이 홈 디렉터리 .keystore 파일에 저장되어 있다고 하고.. 실제 싸인은 jarsigner jar-file alias 이렇게.. alias는 인증서 별칭이 되겠는데 기본적으로는 여기서 8글자 따서 SF랑 DSA 파일 이름 짓는다. 검증할 때는 jarsigner -verify jar-file로 하면 됨.




