
Ich entwickle eine Anwendung, die einige Abhängigkeiten aufweist, und verwende dafür externe Tools. Ein Beispiel ist, dass ich das Putty-Befehlszeilentool plink.exe verwende, um von einem Java-Programm aus per Telnet/SSH auf einen Remote-Computer zuzugreifen.
Wenn ich jetzt zu Ubuntu wechsle, gibt es dafür das Dienstprogramm sshpass, das dasselbe für mich erledigt. Jetzt besteht das Problem darin, dass sshpass noch nicht installiert ist und mein Programm nicht funktioniert, bevor es installiert ist.
Wenn etwas in Windows nicht vorhanden ist, kann ich eine portable ausführbare Datei in mein Programm packen, z. B. diese plink.exe, und sie zur Laufzeit verwenden, um die Aufgabe zu erledigen. Jetzt möchte ich in Ubuntu wissen, ob es eine Möglichkeit gibt, eine .exe-ähnliche Datei zu packen, die ich einfach mit Argumenten aufrufen kann, um ähnliche Aufgaben auszuführen??
Im Grunde möchte ich wissen, ob es in Ubuntu eine Möglichkeit gibt, eine Datei auszuführen, ohne sie installieren zu müssen. Und wenn ja, wie ist das möglich?
Antwort1
Unter Linux wie auch unter Windows können Sie jedes Programm mit allen Abhängigkeiten kompilieren, die als statische Dateien verknüpft sind. Der Unterschied besteht jedoch darin, dass dies unter Linux nicht die übliche Vorgehensweise ist.
Bei Linux wird jedes Programm nur einmal installiert. Wenn Sie shhpass verwenden müssen, sollten Sie es nicht mit Ihrer Software bündeln, sondern als Abhängigkeit in Ihrem Installationspaket auflisten (z. B. Deb-Datei für Ubuntu). Der Paketmanager holt es ab und installiert es, wenn er Ihr Programm installiert.
Es gibt mehrere Gründe für dieses Verhalten, von der Effizienz (Verwendung von gemeinsam genutztem Speicher) bis hin zur Sicherheit (Sie können mit Ihrem gebündelten Programm einen Sicherheitsfehler einschleusen). Wie alles hat auch dieser Ansatz seine Nachteile, vor allem die Notwendigkeit eines zentralen Ortes zur Installation von Software, aber der wichtige Punkt Ihrer Antwort ist, wie die Dinge sind, nicht wie sie sein könnten.
Die kurze Antwort lautet: Ja, das können Sie tun, aber es wird schwierig. Sie würden gegen die Kultur und das Design unixartiger Betriebssysteme ankämpfen. Sie müssen wahrscheinlich Ihre eigenen Versionen aller Programme kompilieren, die Sie bündeln möchten, und den meisten Paketierern und Benutzern wird das nicht gefallen.
Antwort2
Der idiomatische Ansatz unter Ubuntu wäre, nicht Ihr Rohprogramm, sondern ein .deb-Paket herauszugeben, das Ihr Programm enthält und auch seine Abhängigkeiten auflistet. Wenn Sie dann Ihr Paket installieren, werden alle fehlenden Abhängigkeiten automatisch installiert (vorausgesetzt, sie sind in den Standardquellen verfügbar).
Es gibt einige DokumentationenHierzum Erstellen von Paketen.
Der alternative, eher Windows-artige (und sogar etwas OSX-artige) Ansatz besteht darin, statisch verknüpfte Builds aller Ihrer Abhängigkeiten mit Ihrer App zu bündeln und sie in ein temporäres Verzeichnis zu entpacken, von dem aus Sie sie ausführen. Sie können ein Tool wiesich selbst machenGehen Sie dazu wie folgt vor: Legen Sie alle benötigten ausführbaren Dateien sowie Ihre JAR-Dateien und ein geeignetes Startskript in ein Verzeichnis. Der Rest wird von uns erledigt.
Antwort3
Unter Linux kann jede Datei ausgeführt werden (sofern Sie über die entsprechenden Berechtigungen verfügen). Von Ihrem Java-Programm aus können Sie jede .exe-Datei aufrufen, die Sie damit paketieren.
Sie müssen jedoch wahrscheinlich sicherstellen, dass die .exe-Datei unter Linux ausführbar ist. Einige, wenn nicht die meisten .exe-Dateien sind betriebssystemspezifisch. Beispielsweise bietet die Putty-Website nur Quellcode für Unix, der in eine ausführbare Datei kompiliert werden muss (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html). Für Windows ist die ausführbare Datei bereits kompiliert, aber wahrscheinlich nicht unter Linux/Unix ausführbar.