Вы не можете обеспечить это. Существует несколько неуточненных сведений о сгенерированных файлах классов, например, как должен выглядеть код байта определенных выражений исходного кода или порядок членов или атрибутов.
Поскольку в каждом прогоне нет необходимости создавать точно такой же файл, реализация компилятора даже не пытается. Справедливости ради следует предположить, что при выполнении одного и того же программного обеспечения с точно таким же входом (не только с одним и тем же исходным кодом, но и с теми же параметрами) он будет выдавать одинаковый вывод, но для этого требуется не только одна и та же версия компилятора, но также те же JRE.
К сожалению, может быть быть по-разному, даже с тем же внедрением и вводом. Например, были попытки рандомизировать хеширование java.util.HashMap
в некоторых реализациях Java 7, и было бы неудивительно, если javac
хранит определенные артефакты в HashMap
. Это не относится к Java 8, но может применяться к неизменяемым картам, которые будут внедрены в Java 9. Будет ли компилятор использовать эту функцию, не предсказуем.
Итак, если вы нашли конкретную версию jdk, которая воспроизводимо генерирует точно такой же байт-код, вы можете быть в порядке с ней сейчас, но должны знать, что следующая версия может не иметь этого свойства.
До сих пор не было рассмотрено, что даже наличие того же байткода не гарантирует наличие того же файла jar
, поскольку порядок файлов в файлах jar не указан. Это может зависеть от системного порядка итераций файлов. Кроме того, поскольку файлы jar являются zip-файлами, в которых хранятся временные метки, недавно скомпилированный файл класса определенно дает другой файл, если только вы не предпринимаете дополнительных мер, например. обеспечить соблюдение определенной отметки времени для всех записей.
Немного отличается как? – EJP
^Это. Можете ли вы предоставить два примера .class-файлов? – Marco13
Немного отличается в двоичном содержимом. Когда я их различал в winmerge, некоторые из нетекстовых байтов были разными. Я попытаюсь опубликовать снимок экрана. – Shorn