Java Web Start развертывается при запуске Windows - PullRequest
3 голосов
/ 26 октября 2010

У меня есть приложение Java, которое я собираюсь начать использовать Web Start для развертывания.Но новое требование заставило меня переосмыслить это, поскольку теперь я должен добавить часть функциональности, которая позволяет конечному пользователю выбирать, хотят ли они запускать эту программу при запуске (Windows, а не кроссплатформенный).Но я все еще хотел бы уклониться от этого запуска как услуги.Есть ли способ, которым это можно сделать с помощью Web Start, или я должен изучить другие варианты для развертывания этого?Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 28 октября 2010

Это на самом деле работает, чтобы поместить это в jnlp-файл:

<shortcut online="true">
    <desktop/>
    <menu submenu="Startup"/>
</shortcut>

Но это все равно будет работать только с английскими версиями Windows.По-немецки это «Автозапуск», по-испански «Инициар», я думаю.Таким образом, это вызывает в основном ту же головную боль, что и при использовании IntegrationService.

1 голос
/ 19 июля 2013

Чтобы обойти проблему с языком для папки автозагрузки, просто используйте реестр.Вот код, который должен работать.Это вызывает reg.exe для внесения изменений в реестр.

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() {
    // The paths where it will look for java
    String[] paths = {
        // first use the JRE that was used to launch this app, it will probably not reach the below paths
        System.getProperty("java.home") + File.separator + "bin" + File.separator + "javaws.exe",
        // it must check for the 64 bit path first because inside a 32-bit process system32 is actually syswow64
        // 64 bit machine with 32 bit JRE
        System.getenv("SYSTEMROOT") + File.separator + "syswow64" + File.separator + "javaws.exe",
        // 32 bit machine with 32 bit JRE or 64 bit machine with 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("Could not find path for javaws executable");
        }
        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 command returned with exit code -1");
        }
        return result;
    }
}
1 голос
/ 26 октября 2010

Я не пробовал, но мне интересно, можно ли использовать новую JNLP IntegrationService в сочетании с программой командной строки javaws .Идея заключается в том, чтобы программно создать ярлык в группе автозагрузки Windows (хотя это расположение зависит от конкретной версии Windows).

...