3 Stimmen

Java Web Start bereitstellen beim Start von Windows

Ich habe eine Java-Anwendung, die ich gerade mit Web Start bereitzustellen beginnen möchte. Aber eine neue Anforderung hat mich dazu gebracht, dies zu überdenken, da ich jetzt dazu verpflichtet bin, eine Funktionalität hinzuzufügen, die es dem Endbenutzer ermöglicht, auszuwählen, ob sie dieses Programm beim Start (von Windows, nicht plattformübergreifend) ausführen möchten. Aber ich möchte immer noch vermeiden, dass dies als Dienst ausgeführt wird. Gibt es eine Möglichkeit, dies mit Web Start zu erreichen, oder sollte ich andere Möglichkeiten erkunden, um dies bereitzustellen? Danke im Voraus.

4voto

Ansgar Punkte 1727

Es funktioniert tatsächlich, dies in der jnlp-Datei zu platzieren:

Aber das würde nur mit englischen Windows-Versionen funktionieren. Deutsch wäre "Autostart", Spanisch war "Iniciar" glaube ich. Es verursacht also im Grunde dasselbe Kopfzerbrechen wie der Weg über den Integrationsservice.

1voto

kaliatech Punkte 16797

Ich habe es nicht ausprobiert, aber ich frage mich, ob Sie den neuen JNLP IntegrationService in Kombination mit dem javaws Befehlszeilenprogramm nutzen könnten. Die Idee besteht darin, programmatisch eine Verknüpfung in der Windows-Startgruppe zu erstellen (obwohl diese Position von der spezifischen Windows-Version abhängt).

1voto

Sarel Botha Punkte 12053

Um das Sprachproblem für den Startordner zu umgehen, verwenden Sie einfach die Registrierung. Hier ist etwas Code, der funktionieren sollte. Dies ruft reg.exe auf, um Registrierungsänderungen vorzunehmen.

public class StartupCreator {

    public static void setupStartupOnWindows(String jnlpUrl, String applicationName) throws Exception {
        String foundJavaWsPath = findJavaWsOnWindows();
        String cmd = foundJavaWsPath + " -Xnosplash \"" + jnlpUrl + "\"";
        setRegKey("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", applicationName, cmd);
    }

    public static String findJavaWsOnWindows() {
    // Die Pfade, nach denen es nach Java suchen wird
    String[] paths = {
        // zuerst verwenden Sie das JRE, das zum Starten dieser App verwendet wurde, es wird wahrscheinlich nicht die unten stehenden Pfade erreichen
        System.getProperty("java.home") + File.separator + "bin" + File.separator + "javaws.exe",
        // zuerst den 64-Bit-Pfad überprüfen, da innerhalb eines 32-Bit-Prozesses system32 tatsächlich syswow64 ist
        // 64-Bit-Maschine mit 32-Bit-JRE
        System.getenv("SYSTEMROOT") + File.separator + "syswow64" + File.separator + "javaws.exe",
        // 32-Bit-Maschine mit 32-Bit-JRE oder 64-Bit-Maschine mit 64-Bit-JRE
        System.getenv("SYSTEMROOT") + File.separator + "system32" + File.separator + "javaws.exe",};
        return findJavaWsInPaths(paths);
    }

    public static String findJavaWsInPaths(String[] paths) throws RuntimeException {
        String foundJavaWsPath = null;
        for (String p : paths) {
            File f = new File(p);
            if (f.exists()) {
                foundJavaWsPath = p;
                break;
            }
        }
        if (foundJavaWsPath == null) {
            throw new RuntimeException("Konnte den Pfad zur javaws-Ausführungsdatei nicht finden");
        }
        return foundJavaWsPath;
    }

    public static String setRegKey(String location, String regKey, String regValue) throws Exception {
        String regCommand = "add \"" + location + "\" /v \"" + regKey + "\" /f /d \"" + regValue + "\"";

        return doReg(regCommand);
    }

    public static String doReg(String regCommand) throws Exception {

        final String REG_UTIL = "reg";
        final String regUtilCmd = REG_UTIL + " " + regCommand;
        return runProcess(regUtilCmd);
    }

    public static String runProcess(final String regUtilCmd) throws Exception {
        StringWriter sw = new StringWriter();
        Process process = Runtime.getRuntime().exec(regUtilCmd);

        InputStream is = process.getInputStream();
        int c = 0;
        while ((c = is.read()) != -1) {
            sw.write(c);
        }
        String result = sw.toString();
        try {
            process.waitFor();
        } catch (Throwable ex) {
            System.out.println(ex.getMessage());
        }
        if (process.exitValue() == -1) {
            throw new Exception("REG QUERY-Befehl wurde mit dem Exit-Code -1 zurückgegeben");
        }
        return result;
    }
}

0 Stimmen

Dies funktioniert! Vielleicht etwas langsam (die Anwendung reagiert für einige Sekunden nicht, ich glaube, es könnte an diesem Code liegen), aber es funktioniert. Jetzt brauche ich etwas, um meine Anwendung selbst beim Start automatisch zu starten (nicht über die JNLP-Datei)...

0 Stimmen

Führen Sie den Code über SwingWorker aus, und er wird im Hintergrund ausgeführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X