Eine EXE bauen,ist eine nicht triviale Angelegenheit.
Java-Programme bestehen meistens aus einer Vielzahl von JAR-Dateien, manchmal Hunderte und diese müssten ja alle irgendwie zu einer EXE zusammengepanscht werden.
Also läuft es darauf hinaus, das ganze Java (Runtime+Klassenlibs) zusammenzupacken.
Nichts für ungut, aber diese Denkweise steht dem Java-Gedanken diametral entgegen. (EXE=Windows, und was machst du unter Linux?)
Aber es gibt Abhilfe in der Form sogenannter Wrapper-Tools, von denen zwei JSmooth bzw. Launch4j bekannte Vertreter sind.
JSmooth habe ich bereits mehrmals eingesetzt, wenn beispielsweise "Mausschubser" unter Windows es gewohnt sind, eine EXE per Doppelklick zu starten.
Manchmal ist es schwierig Benutzern beizubringen, das es auch möglich ist eine JAR per Doppelklick zu starten, aber was rede ich ?
Na, jedenfalls kann man mit JSmooth eine EXE erstellen, die mit einer JRE geliefert wird, so das sichergestellt ist, das die Applikation mit der richtigen Java-Version startet. Hierfür eigentlich "nur" der Start der JVM so verpackt, das der Aufruf so aussieht wie eine EXE-Datei, im Hintergrund wird aber eine JVM mit allen notwendigen Parametern zusammen gebaut.
PS. Es gibt natürlich noch Webstart, mit dem das alles auch funktioniert.