neuen Prozess starten und anwendung beenden.

delphiking1980

Bekanntes Mitglied
Hallo,

ich möchte eine Updatefunktion für meine kleine Anwendung implementieren, nun habe ich das neue JAR File herruntergeladen (das ist das einfachste) nun muss ich aber irgendwie die Anwendungen austauschen, quasi das alte JAR File löschen und das neue platzieren, ich kann aber nicht aus der Anwendung herraus die aktive JAR Datei löschen (Den Ast absägen auf dem man sitzt.)

Meine Idee bisher :

Ich schreibe eine kleine Batchdatei welche als Prozess gestartet wird und erstmal 5sek. pause macht, in der Zeit beendet meine eigentliche Anwendung (die Anwendung braucht deutlich weniger als 5sek. zum beenden) und dann wird das alte JAR File gelöscht und das neue kopiert.

Auch könnte ich mir vorstellen das ich eine Start.jar habe welche der Benutzer startet und diese dann auf Updates prüft und danach die eigentliche JAR startet.

Aber das klingt alles etwas nach herrum gefrickel gibt es eine bessere Lösung ?
 
Ich halte Möglichkeit zwei für sinnvoller. Aber man kann ja auch nur einzelne .class Dateien ersetzen. Dann könntest du eine Uptdateklasse haben, die dann die erneuerten .class Dateien im .jar Archiv speichert.
 
okay hört sich gut an, also muss ich das JAR als ZIP öffnen und die neuen Klassen einfügen ?
Dann muss ich mir ja alle geänderten Klassen merken oder ?
 
Meine Lösung

Java:
package de.stefandraegersoftware.start;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Start {

	private static final String PROPERTIE_FILENAME = "./properties.prop";

	private static final String UPDATE_PROP = "updateBeforeStart";
	private static final String UPDATE_FILENAME_PROP = "updatefile";
	private static final String XMX_PROP = "xmx";
	private static final String XMS_PROP = "xms";
	private static final String STARTAPPL_PROP = "startappl";
	private static final String JAVA_PARAMETER = "java";
	private static final String JAR_PARAMETER = "-jar";

	private static Properties properties = null;

	public static void main(String... args) {
		loadPropertieFile();
		if (properties != null) {
			Boolean updateBeforeStart = Boolean.parseBoolean(properties.getProperty(UPDATE_PROP));
			String updateFilename = properties.getProperty(UPDATE_FILENAME_PROP);
			File updateFile = new File(updateFilename);
			if (updateBeforeStart && updateFile.exists()) {
				if (deleteOldApplication()) {
					moveAndRenameNewApplication();
				}
			}
			startApplication();
		}
	}

	private static boolean moveAndRenameNewApplication() {
		boolean result = false;
		String updateFilename = properties.getProperty(UPDATE_FILENAME_PROP);
		String startApplicationFilename = properties.getProperty(STARTAPPL_PROP);
		File file = new File(updateFilename);
		if (file.exists()) {
			result = file.renameTo(new File(startApplicationFilename));
		}
		return result;
	}

	private static boolean deleteOldApplication() {
		boolean result = false;
		String filename = properties.getProperty(STARTAPPL_PROP);
		File file = new File(filename);
		if (file.exists()) {
			result = file.delete();
		}
		return result;
	}

	private static void loadPropertieFile() {
		File file = new File(PROPERTIE_FILENAME);
		if (file.exists()) {
			FileInputStream fInStream = null;
			try {
				fInStream = new FileInputStream(file);
				properties = new Properties();
				properties.load(fInStream);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (fInStream != null) {
					try {
						fInStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

	private static void startApplication() {
		try {
			new ProcessBuilder(getStartParameterFromProperties()).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static String[] getStartParameterFromProperties() {
		String xmx = "-Xmx".concat(properties.getProperty(XMX_PROP));
		String xms = "-Xms".concat(properties.getProperty(XMS_PROP));
		String startApplication = properties.getProperty(STARTAPPL_PROP);

		String[] parameter = new String[] { JAVA_PARAMETER, JAR_PARAMETER, xmx, xms, startApplication };
		return parameter;
	}
}
 

Zurück
Oben