The first thing to understand is that your question contains an erroneous assumption. You are asking about the โcomplete build process from source to hardware-specific binariesโ - but the normal Java build process never creates architecture-specific binaries. It reaches an architecture-independent bytecode and then stops. Of course, it is true that in most cases this bytecode will be translated into native code that will be executed, but this step occurs at run time, inside the JVM, completely in memory and does not include the creation of binary files - it is not part of the process assembly.
There are exceptions: compilers such as GCJ can create their own binaries, but this is rarely done.
So, the only significant step that happens as part of the build process is compilation. The compiler reads the source code, performs the usual parsing and resolution steps, and emits bytecode. This process is not indicated in any way; as usual, the language specification defines what the elements of the language are and what they mean, but not how to compile them. What is indicated in the output format: the bytecode is packed in the form of class files , one for each class, which, in turn, can be grouped together in jar files for ease of distribution.
When class files are to be executed, additional steps are possible before execution. They are reasonably well specified in the chapter Download, Layout, and Initialization in the JVM Specification. But, as I said, they are not part of the assembly process.
There are several other steps that can occur during the build process, usually before compilation: dependencies can be resolved and downloaded, resources can be copied and converted between character sets, and code can be generated. But none of them is standard, that's all that is added to the main compilation process by various building tools.
source share