Wie bereits erwähnt: Launch4J ist auch eine Möglichkeit.
Dieses Tool kannte ich nicht und ist mir bei der Recherche nicht auffällig geworden. Aber beim überfliegen dieser Anwendung (
http://launch4j.sourceforge.net/) ist mir aufgefallen, dass es ausschließlich für Windows konzipiert ist. Aber für den einen oder anderen sehr interessant.
Grundsätzlich sehe ich jetzt aber nicht so das große Problem oder Umstand die JAR über ein Skript zu starten.
Ich sehe da grundsätzlich auch kein Problem darin. Aber zwei Tatsachen würde ich gerne anführen:
1.)
hansmueller hat gesagt.:
...(Die meisten Anwender sind DAUs, aber eben nicht alle.)...
2.)
Das Grundkonzept hinter ganzen Geschichte besteht auf "einer einzigen" ausführbaren Datei. Dabei möchte ich nochmal auf meinen ersten Beitrag zu diesem Thema verweisen:
roadrunner22x hat gesagt.:
Das Programm wird später nicht von mir genutzt und dem User erklären, dass er ein Batch/Shell starten soll oder wo möglich noch eine Konsole öffnen muss und dort was rein hacken, geht mir persönlich zu weit und hat nix mit Usability zu tun.
Das mit dem WebStarter hatte ich mir auch überlegt. Und das scheint auch eine sehr praktische Lösung zu sein, aber es wurde schon auf die 2 Dateien-Umsetzung hingewiesen. Was dem Grundkonzept widerspricht. Siehe den Vorraussetzungen innerhalb diesem Beitrages, etwas weiter unten.
Die Möglichkeit mit den zwei Jars in einem packen, hatte ich auch schon in anderen Foren gelesen. Dabei sind mir außer "Pack einfach zwei Jars in einem, oder benutze zwei Main-Methoden (Punkt)", keine konkreten Lösungsansätze aufgefallen. Was hilft mir ein theoretischer Ansatz. Aus diesem Grund wählte ich den wohl etwas einfacheren Weg.
hansmueller hat gesagt.:
Ich würde ProcessBuilder.start() statt Runtime.getRuntime().exec() verwenden. Habe mal irgendwo gelesen, daß ProcessBuilder neuer und besser sein soll.
Kannst du das noch etwas genauer erklären? Bzw. hast du einen Link für diese Aussage? Vielleicht kann man das ja wirklich verwenden.
hansmueller hat gesagt.:
... alle Komandos der Reihe nach in den ProcessBuilder ...
Dies hatte ich auch schon versucht, ohne Erfolg. Wenn der Java Heap Size geändert werden soll, muss dieser mit dem Aufruf des Programms übergeben werden, das setzt aber einen separaten Prozess voraus. Aber du kannst mir gerne einen Implementierungsvorschlag unterbreiten.
hansmueller hat gesagt.:
Kann man da aber auch noch eine Möglichkeit einbauen, falls der Anwender bereits so schlau war, von sich aus die JHS zu erhöhen?
Diese Prüfung übernimmt diese bereits "von Anfang an implementierte" Methode:
Code:
/**
* This method examines the need for a restart. This is based on the size of the maximum java heap size of
* JVM and the desired maximum java heap size.
* @param parameters - arguments on startup
* @return
*/
public static boolean checkNeedToRestart(String [] parameters)
{
delTempBatchFile();
if (getMaxHeapSpace() < referenceMaxJavaSize)
{
try {
restart(parameters);
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
wakoz hat gesagt.:
Aber dein Weg ist umständlich und die Verbesserungs Ideen von uns musst du nicht kaputt schreiben.
Ich muss hier keinen „kaputt schreiben“. Ich verweise nur auf meinen ersten Beitrag zu diesem Thema hin. Dieser erklärt ausführlich meine Umsetzung und den Background. Und wenn man diesen nicht richtig liest oder auch nicht richtig lesen will, kannst du oder wer auch immer seine Zeit auch sinnvoller nutzen, als hier etwas zuschreiben. Die meisten deiner Nachfragen oder so genannten Verbesserungsvorschläge werden mit dem ersten Beitrag erfüllt.
Beispiele, gefällig?:
1.)
wakoz hat gesagt.:
...aus der Anwendung heraus das OS ermitteln ...
siehe:
Code:
filterOnOSSystem(String [] parameters, String jarFile)
2.)
wakoz hat gesagt.:
...Oder zum Beispiel die Anwendung mit Scripten auszugeben ...
siehe:
roadrunner22x hat gesagt.:
Die Prämisse liegt darauf, dass dem User nur eine Datei zugesendet wird. ...
3.)
wakoz und benhaze haben mir bis zum heutigem Tag noch nicht sagen können, wie man den Java Heap Size zur „Laufzeit“ erhöhen kann. Den eine konkrete Umsetzung liegt mir von euch nicht vor. Ich kann ja euch nochmal die Voraussetzungen geben, vielleicht hilft das euch weiter:
- Das eigentliche Programm ist eine Standalone-Version
- keine Möglichkeit für Internet
- nur eine Jar, keine extra Batch, Shell etc. („temporär“ ist dies aber erlaubt, muss aber für User nicht sichtbar sein)
- User soll ausschließlich per „Doppelklick“ auf die Jar das Programm starten, keine Konsole oder Batch, Shell etc.
- der User sollte an seiner JVM nichts an den Einstellungen ändern müssen ( siehe
http://www.duckware.com/pmvr/howtoincreaseappletmemory.html), da dieser meistens nicht in der Lage dazu ist.
- zusammenfassend ist sagen, ich gehe davon aus, dass der User so "dumm wie ein Sack Reis" ist. Das ist jetzt nicht böse gemeint, soll aber meine Lage verdeutlichen
4.)
wakoz hat gesagt.:
jetzt soll es auf einmal Plattform unabhängig sein?
siehe:
roadrunner22x hat gesagt.:
Wie bereits erwähnt, ist die hier vorgestellte Klasse vorrangig für Windows ausgelegt. Kann aber beliebig erweitert werden.
Für mich sind momentan erst mal nur Windows-Systeme interessant. Zukünftig werden auch andere Systeme betrachtet. Die Funktion „linuxScriptFile (String [] parameters, String jarFile)“ sollte zeigen an welche Stelle man „ beliebig erweitert“ kann, um eine Plattformunabhängigkeit zu erzielen.
Verstehst du was ich damit sagen will?!
Hätte "von und zu Gutenberg" seiner Arbeit auch genau gelesen, hätte er jetzt auch nicht die Probleme.
So lange mir einer keine „konkreten“ alternativen Lösungsvorschläge (auf Quellcode-Ebene) für ein autarkes Programm (entsprechend den Voraussetzungen die ich oben genannt habe) unterbreiten kann, glaube ich, dass ich einen guten Lösungsansatz produziert habe. Und durch eure Aussagen werde ich in meiner Meinung bestättigt.
@wakoz und @benhaze:
Ihr könnt mir gerne alternative Quelltext-Passagen zuschicken bzw. hier schreiben. Vielleicht kann man ja einen gemeinsamen Nenner oder eine exemplarische Lösung für dieses Problem finden.
Lieben Gruß
de roadrunner ;-)