2016-09-18 3 views
2

jar 명령을 사용하여 jar 파일을 만듭니다. md5 서명을 사용하여 jar 파일을 캐시하는 동안 정확한 소스에서 생성 된 jar에는 다른 md5 서명이 있음을 발견했습니다. 더 자세히 조사하자마자 항아리가 만들어 질 때마다 내용이 정확히 동일하다는 것을 알게되었습니다 (diff -qr은 비어 있음). 생성의 타임 스탬프는 md5 서명을 버리는 jar 파일에 인코딩되어있는 것으로 나타났습니다. 다른 사람들은 동일한 것을 발견했습니다 : Java/zip: Why are .jar files non-deterministically created?결정적으로 .jar 파일 만들기 (매번 동일)

매번 maven : http://gary-rowe.com/agilestack/2013/08/08/how-to-create-a-deterministic-jar과 똑같이 jar 파일을 동일하게 만드는 방법에 대한 블로그 게시물이 있습니다. 그러나 jar 및 zip (설치 권한없이 서버에서이 작업을 수행해야 할 수도 있음)과 같이 쉽게 사용할 수있는 명령을 사용하는 명령 줄을 사용하는 간단한 솔루션이 필요합니다. 현재 사용중인 것과 동일한 "기능"항아리로 연결될 수 있습니다. jar 명령.

편집 : 내 목적을 위해, 또한 에 충분는 항아리가 동일하지 않은 경우에도에서 동일 빌드되도록 빨리는 MD5를 찾을 수 있습니다. 지금까지 찾은 유일한 방법은 jar 파일을 압축 해제하고 모든 구성 요소 파일을 md5로 복사하는 것입니다. 그러나 나는 더 큰 항아리에 대해서는 느리고 처음부터 캐스팅하지 않으려 고 캐싱의 목적을 물리 칠 것입니다. 더 빠르고 더 좋은 솔루션이 있습니까?

+0

그래서 소스를 항아리로 컴파일한다면 간단히 한 번만 실행 한 다음 xcopy 명령을 실행하거나 해당 항아리를 복사하지 말아야합니다. – 3kings

+0

비트가 같은 컨테이너를 갖는 것이 중요한 이유는 무엇입니까? – chrylis

+0

문제는, 나는 항아리를 캐쉬하려고한다. 항아리는 여러 소스 (java 파일, 다른 항아리)를 사용하여 빌드된다. 특정 jar를 빌드해야하는지 여부를 판별하기 위해 모든 소스 java 파일과 jar의 md5가 계산됩니다. 컴포넌트 jar는 캐싱없이 리빌드되며, 이런 일이 발생하면 md5s가 변경되어 더 큰 jar에 대한 캐싱이 해제됩니다. – user34812

답변

0

주된 문제는 항상 현재 시간으로 META-INF\MANIFEST.MF을 작성하는 병 명령입니다. 파일 시간은 zip 항목 헤더에 저장됩니다. 따라서 MD5 값이 다른 이유는 jar의 모든 파일 내용이 동일하기 때문입니다. 다른 zip 항목 헤더가 다른 zip 파일을 생성합니다.

jar 명령의 유일한 해결책은 -M 옵션입니다. 항목에 대한 목록 파일을 만들지 마십시오.

+0

이것이 실제로 md5가 동일한 jar를 생성하는지 확인합니다. 항아리도 작동합니다. 매니 페스트가 부족하여 걱정할 사항이 있으면 간단히 언급 할 수 있습니까? – user34812

+0

ZIP (항아리는 단지 twipled zip 파일 인 IIRC)이 아니라 .class 파일의 메타 데이터도 저장합니까? .class 파일 중 하나에서 유닉스 터치를했다면 메타 데이터가 혼란스럽지 않고 체크섬이 엉망이 되겠습니까? 솔직히 나는 잘 모르겠다. 그냥 물어 보는 건데. –

+0

@ user34812 이것은 manifest 파일이 jar 파일에 대한 정보를 저장하는 데 사용되기 때문에 jar 파일을 어떻게 사용할 것인지에 달려 있습니다. 예 : [이 기능들] (https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html)/OSGi 번들 작성 등이 필요한 경우. 매니페스트 파일이 필요합니다. –