Wie kann man aus einem Java-Programm eine richtige .exe machen?
Ich meine nicht Launch4j, denn damit ist der Source Code immer noch einsehbar und man erkennt sofort, dass es quasi vorher die Endung .jar hatte.
Ich hab es mal mit Gradle > build > build versucht und es erstellt sich in
C:\Users\USER\Desktop\workspace\Project\build\distributions\Programm-1.0\Programm-1.0\bin
eine Datei, die einfach nur Programm heißt - nicht mal eine Dateiendung. Mit in /bin ist noch eine Programm.bat enthalten.
Mir wurde mal gesagt, das damit (oder so ähnlich) richtige Programme erstellt werden (nicht das Programmieren selber). Wenn ich jedoch die .bat starte, schließt sich die Eingabeaufforderung gleich wieder.
Wenn das alles totaler Unsinn ist, ist dennoch Folgendes mein Vorhaben:
Programm.jar soll ein eigenes Setup.exe bekommen und muss vorher richtig installiert werden. Also es soll nicht einfach eine Datei mit der Endung .jar herumschwimmen.
- Ich arbeite mit IntelliJ IDEA (2021.3.2)
3 Antworten
Das geht z.B. mit diesem Tool:
Damit kann man eine kompilierte JAR-Datei in eine EXE-Datei verpacken und auch Startparameter angeben. Auch ein Symbol kann man dann in die EXE mit reinpacken.
Das Tool sieht so aus:
![- (Computer, Technik, PC)](https://images.gutefrage.net/media/fragen-antworten/bilder/481096063/0_big.png?v=1670741859000)
Ich meine nicht Launch4j, denn damit ist der Source Code immer noch einsehbar
Der Source Code von kompilierten Java Programmen ist nicht einsehbar. Ein Decompiler kann dir höchstens Code mit äquivalenter Funktionalität geben und wenn man einen Obfuscator drüber laufen lässt ist der auch noch ziemlich unverständlich.
man erkennt sofort, dass es quasi vorher die Endung .jar hatte.
Eigentlich nicht wenn man es richtig macht.
Mir wurde mal gesagt, das damit (oder so ähnlich) richtige Programme erstellt werden (nicht das Programmieren selber).
Um das mal klarzustellen: Es ist auch als Jar Datei ein richtiges Programm.
Man kann Java Programme nicht so einfach als Windows Executable verpacken, da diese eigentliche Executable Java selbst ist.
Programm.jar soll ein eigenes Setup.exe bekommen und muss vorher richtig installiert werden. Also es soll nicht einfach eine Datei mit der Endung .jar herumschwimmen.
Installer und das Programm selbst sind zwei komplett verschiedene paar Schuhe. Den Installer muss man eigentlich nicht selbst schreiben. Dafür gibt es von Microsoft selbst Werkzeuge und auch noch etliche Hilfsmittel von Drittanbietern. Für das Programm selbst gibt es dann noch ein paar Varianten:
1. Jar mit einer JLink JVMDas ist mittlerweile die übliche und auch definitiv sinnvollste Variante. Der Installer packt die Jar des Programmes und Bibliotheken in den Installationsordner und dazu kommt eine mit JLink erstellte leichtgewichtige JVM. Falls man es unbedingt möchte kann man auch wie oben erklärt einen Obfuscator nutzen.
Da der Installer entsprechende Verknüpfungen erstellt, bekommt der Nutzer erst mal nichts davon mit, dass Java verwendet wird. Dazu muss man sich dann schon den Installationsordner selbst anschauen.
2. Launch4J und ähnliche ProgrammeDas kennst du ja selbst schon. Ich sehe aber keinen Sinn dahinter wenn man ohnehin einen Installer verwendet.
3. AOT CompilerDamit bekommst du ein komplett natives Programm als Exe. Da das ganze aber ziemlich überflüssig ist, stirbt dieses Konzept zunehmend aus. 2019 ist mit Excelsior Jet einer der letzten relevanten Vertreter vom Markt gegangen.
4. Kotlin/NativeDas ist zwar kein Java aber nahe dran. Es nutzt wie 3. einen AOT Compiler. Das ganze hat aber auch ein anderes Konzept, nämlich die Low Level Entwicklung. Damit kann man beispielweise direkt auf C Code zugreifen, kann dafür aber keine Java Bibliotheken nutzen.
BeispielDas von dir genutzte IntelliJ ist das beste Beispiel für Variante 1. Dem sieht man auch nicht an, dass es ein Java Programm ist. Es nutzt sogar Swing ohne dass man es so leicht merkt.
Ich bin kein Java-Experte, aber egal was Du tust, man kann den Quellcode immer herausfinden.
Selbst wenn Du eine "richtige" Exe hast, ohne jar-Datei, dann hat es die jar-Datei vermutlich nur als Embedded-Ressource dabei und das kann man wieder auslesen.
Eventuell kann man Java auch nativ kompilieren, aber damit verlierst Du viele Eigenschaften, die an vielen Stellen wichtig sind. Bei C# gab's sowas mal, hat sich aber nicht durchgesetzt.
Sicher kriegst Du das also nicht.
Wer dein Programm knacken will, knackt es, dagegen kannst Du nichts tun. Deshalb umgeht man das Thema bei sicherheitsrelevanten Dingen so, dass z.B. Passwörter einfach nicht im Code stehen und daher auch nicht geklaut werden können.
Und wenn's dir um die Optik geht:
Stell ein Programm daneben, was java mit der jar startet, entweder aus einem Unterordner oder als Embedded-Ressource. Gibt sicher Tools, die sowas schon können.
Oder lass es einfach :D
Dass interessiert doch niemanden, die die das Programm starten, sehen im Zweifel nur das Startmenü-Icon und das kann auch ein langweiliger Link sein.
Ich denke, dass es erst mal ausreicht, wenn ich 'nen Obfuscator drüber laufen lasse.
ProGuard soll dafür gut und bekannt sein, stimmst Du dem zu?