2009-04-15 14 views
6

Wygląda na to, że tworzenie słoika lub zip z dokładnie tych samych plików źródłowych zawsze przyniesie inny plik. Próbowałem tego zarówno za pomocą polecenia jar Javy, jak i zadań słoika i zip w ant.Różnica binarna w pliku Zip/Jar

Wygląda na to, że nowe słoiki/zamki mają znacznik czasu ustawiony na bieżący czas dla każdego zapisanego pliku.

Czy istnieje sposób zmuszenia narzędzia zip do użycia znacznika czasu w pliku w systemie plików, aby upewnić się, że słoik zbudowany z tego samego źródła będzie wyglądał dokładnie tak samo?

+0

Jeśli szukasz instrukcji krok po kroku do budowania deterministycznego JAR (powtarzalny podpis SHA1), oto artykuł: http: //gary-rowe.com/agilestack/2013/08/08/how-to-create-a-deterministic-jar/ –

+0

JAR to nieco inny format niż ZIP. JAR jest oparty na ZIP, ale zawiera pliki manifestu i sygnatury, a ZIP nie. – jww

Odpowiedz

1

Ok, współpracownik i ja wymyśliliśmy rozwiązanie, które działa dla nas.

Zamiast reengineering cały nasz proces budowania aby nie usuwać żadnych plików JAR klasy, używamy tej procedury:

  1. budować nowe artefakty.
  2. Użyj jardiff (część jnlp), aby porównać zmiany z poprzedniej kompilacji.
  3. Jeśli słoik diff wytwarzany przez jardiff nie ma żadnych zmian, pobierz artefakt z poprzedniej kompilacji.

Tak, wiem, że to brzmi kludgy, ale na pewno bije przepisanie skryptu budowania, aby wziąć to pod uwagę. Możemy również wykonać całkowicie czystą kompilację na świeżej maszynie (w przypadku awarii serwera), a proces ten zapewni, że produkowane będą tylko faktycznie zaktualizowane słoiki.

1

Nie sądzę, że istnieje sposób na zrobienie tego zipem, ale z pewnością można by wbić znaczniki czasu plików w systemie plików do znanej daty (używając polecenia "dotknij" w systemie unix - nie wiem co pod Windows) przed utworzeniem słoika.

+1

w systemie Windows dostępne są narzędzia dotykowe. Ale to nie rozwiąże problemu, jak to rozumiem. Wydaje się, że pytanie brzmi, że wpisy w pliku zip uzyskują CZAS BIEŻĄCY, a nie czas w pliku. Dotknięcie tego nie naprawi. – Cheeso

+0

Nie, prawdziwy problem polega na tym, że jeśli odzyskasz plik - nawet jeśli wygenerujesz go z tą samą zawartością - otrzyma on znacznik czasu mtime z ostatniej regeneracji, więc jeśli skompresujesz ten plik, ponieważ zip zapisuje mtime, to będą różne, nawet jeśli zawartość będzie taka sama. – pjz

+0

Cheeso jest poprawne. Nawet wykonanie tych samych plików źródłowych i dwukrotne utworzenie słoika spowoduje zmianę znaczników czasu w słoiku. –

1

Miałem podobny problem i, jak sugeruje Pjz, rozwiązałem go przez "dotknięcie" plików przed dodaniem ich do słoika (tak, zadziałało to dla mnie :-)). Możesz znaleźć dotyk dla Windows, jeśli tego potrzebujesz, albo w GNU Windows Utilities, core utils: http://gnuwin32.sourceforge.net/packages/coreutils.htm, ale jest to duży pakiet dla tego tylko jednego (choć jest tam wiele innych użytecznych narzędzi, które możesz lubić), lub alternatywnie , pobierz coś w stylu: http://www.softpedia.com/progClean/Touch-for-Windows-Clean-41086.html.

+0

Próbowałem tego pierwszy, niestety, to nie działa. Zobacz komentarz Cheeso powyżej. –

3

Różnica binarna wynika ze znacznika czasowego plików manifestu. Jeśli pozwolisz słoiczkowi utworzyć sam manifest, utworzy on manifest na linii i ustawi utworzony manifest na currentTimeMillis.

Można go rozwiązać przez:
1. Nie dodawaj oczywisty (jeśli przy użyciu ant należy użyć zip zamiast słoika)
2. Dodaj manifestu jak dodasz normalne pliki. (Więc manifest jest plikiem w twoim systemie plików i nie jest tworzony w locie)

Powiązane problemy