Kann jemand erklären, wie identische Java-Quellen zu binären unterschiedlichen Klassen-Dateien kompilieren können?Identische Java-Quellen kompilieren zu unterschiedlichen Binärklassen
Die Frage stellt sich aus der folgenden Situation:
Wir haben eine ziemlich große Anwendung (800+ Klassen), die verzweigt wurde, neu strukturiert dann zurück in den Kofferraum reintegriert. Vor der Reintegration haben wir den Stamm in den Zweig integriert, was eine Standardprozedur ist.
Das Endergebnis war eine Reihe von Verzeichnissen mit den Zweigquellen und eine Reihe von Verzeichnissen mit den Stammquellen. Mit Beyond Compare konnten wir feststellen, dass beide Quellen identisch waren. Beim Kompilieren (dasselbe JDK unter Verwendung von Maven in IntelliJ v11) stellten wir jedoch fest, dass ungefähr ein Dutzend der Klassendateien unterschiedlich waren.
Als wir die Quelle für jedes Paar scheinbar unterschiedlicher Klassendateien dekompiliert haben, haben wir am Ende die gleiche Java-Quelle gefunden, was das Endergebnis betrifft, scheint es nicht wichtig zu sein. Aber warum sind nur ein paar Dateien unterschiedlich?
Danke.
Weitere Gedanken:
Wenn Maven/javac Dateien in einer anderen Reihenfolge kompiliert, dass das Endergebnis beeinflussen könnten?
verschiedene jdk-Versionen? Ich kann mir vorstellen, dass die Optimierungen für verschiedene Versionen unterschiedlich sein können. – RNJ
Mit javap -c -v (danke Peter Lawrey) und die jeweiligen Ausgaben mit Beyond Compare (tolles Werkzeug, liebe es!) Ich kann bestätigen, dass Punkt 5 auf Stephen C (Antwort Stephen C) gibt einen Teil der Antwort hier. In einigen Fällen ist die Reihenfolge der konstanten Pools unterschiedlich. Ich bin jedoch ziemlich sicher, dass der Klassenpfad für beide gleich ist, aber die Reihenfolge der Kompilierung kann unterschiedlich sein. – Vicki