Zastanawiam się nad sprawdzeniem wartości mieszania pliku jar, aby ustalić, czy uległa ona zmianie, ale okazuje się, że ten sam plik JAR ma różne hashe za każdym razem, gdy go kompiluję (eksportuj jako plik JAR z zaćmienia lub skompiluj go przy użyciu maven). Usunąłem wartości daty pliku manifestu i takie tam, ale nadal jest inaczej. Czy jest coś w generowaniu kodu bajtowego, które zawiera znacznik czasu lub coś takiego?Dlaczego ten sam plik JAR ma różny skrót za każdym razem, gdy go buduję?
Odpowiedz
Plik JAR jest plikiem ZIP i zawiera datę ostatniej modyfikacji w nagłówku pliku katalogu local file headers. Doprowadzi to do różnych skrótów twoich buildów.
Jeśli uruchomisz polecenie JAR na dokładnie tym samym zestawie plików (z tymi samymi datami pliku) i pominiesz utworzenie pliku manifestu, to powinien on podać dokładnie ten sam plik JAR (jeśli kolejność plików wewnątrz ZIPa się nie zmienia) .
Czy istnieje sposób, aby powiedzieć, aby zignorować daty plików? Lub usunąć je z nagłówków? – user218046
@ user218046 Wydaje się niemożliwe. Ale poleciłbym przejść na inny sposób generowania skrótu, np. użyj zadania sumy kontrolnej w plikach przed umieszczeniem ich w pliku JAR, https://ant.apache.org/manual/Tasks/checksum.html – wero
Wygląda na to, że jest uzasadniony. Dziękuję za odpowiedź. – user218046
Aby odpowiedzieć na inne pytanie, nie, w bajtodzie nie ma znaczników czasowych. Ale plik zip oczywiście ma znaczniki czasu. Jeśli chcesz odtwarzać kompilacje Java, powinieneś sprawdzić Bazel. – Antimony