Путь не найден в исполняемом Jar

#java

#java

Вопрос:

В настоящее время я добавляю VBS script for hMailServer в свой Java-код для настройки сервера перед запуском моего клиента JavaMail. Все работает через eclipse, однако, когда я экспортирую в исполняемый jar, я думаю, что путь к файлу неверен. например, через eclipse я вижу cscript C:UsersusernameDesktopRadioWithEmailtargetclassesscripthmail-create-account1.vbs user password test.au , что работает отлично. Из исполняемого jar, который я получаю cscript file:C:UsersusernameDesktopNeoChat.jar!scripthmail-create-account1.vbs user password test.au ниже, мой код. Какую ошибку я допустил в отношении получения пути к файлу? Приветствуются любые советы. Заранее спасибо.

  public class emailLogin {

    private Stage primaryStage;
    private PersistenceAccess persistenceAccess = new PersistenceAccess();

    private User me;
    private Settings settings;
    private EmailManager emailManager = new EmailManager(settings);
    private File f;

    private MainUiController ui;

    public emailLogin(Stage stage, final Settings settings, MainUiController ui) throws Exception {
        this.settings = settings;
        this.ui = ui;
        me = settings.getMe();
        String user = me.getNick();
        String ip = me.getIpAddress();
        String emailaddress = user   "@"   ip;
        /* Routine to bring the account onto hMailserver */
        f = new File(getClass().getResource("/script/hmail-create-account1.vbs").getFile());
        // String path = f.getPath();
        // String pathto =('"' path '"');
        System.out.println("cscript "   f   " "   user   " "   "password"   " "   ip);
        Runtime.getRuntime().exec("cscript "   f   " "   user   " "   "password"   " "   ip);

        ViewFactory viewFactory = new ViewFactory(emailManager);

        List<ValidAccount> validAccounts = persistenceAccess.loadFromPersistence();
        if (validAccounts.size() > 0) {
            viewFactory.showMainWindow(settings, ui);
            for (ValidAccount validAccount : validAccounts) {
                EmailAccount emailAccountupdate = new EmailAccount(validAccount.getAddress(),
                        validAccount.getPassword(), me.getIpAddress());
                LoginService loginService = new LoginService(emailAccountupdate, emailManager, settings, ui);
                loginService.start();
            }
        } else {
            viewFactory.showLoginWindow(settings, ui);
        }

    }

    public void stop() throws Exception {
        List<ValidAccount> validAccounts = new ArrayList<ValidAccount>();
        for (EmailAccount emailAccount : emailManager.getEmailAccounts()) {
            validAccounts.add(new ValidAccount(emailAccount.getAddress(), emailAccount.getPassword()));
        }
        persistenceAccess.savePersistence(validAccounts);
    }
}
  

Комментарии:

1. Должны ли пути быть разными для двух случаев? То есть вы хотите, чтобы скрипт .vbs выходил из файла .jar? Я предполагаю, что C:UsersusernameDesktopNeoChat.jar откуда берется код, когда вы запускаете его как .jar. Если ответ «Да», то в чем именно проблема? Этот файл не найден в .jar? Вы, кажется, говорите, что путь неверен. Как это неправильно? Какие сообщения об ошибках вы получаете? Я думаю, что вам было бы очень полезно более подробно объяснить, что происходит, когда вы запускаете его из .jar.

2. Спасибо Стиву и приношу извинения за любую путаницу, когда я запускаю из jar, скрипт не найден и не запущен. Он отлично работает из eclipse. Ваше предположение о C:UsersusernameDesktopNeoChat.jar для банки это правильно. Да, я хочу, чтобы скрипт запускался из jar, чтобы его можно было запускать на любом компьютере. Надеюсь, это имеет смысл

3. Имеет смысл. Итак, возникает вопрос, почему он не найден в .jar. Чтобы это работало, в пути к классу должен быть каталог с именем scripts , и этот каталог должен содержать скрипт hmail-create-account1.vbs . Вы смотрели, что на самом деле находится в файле .jar? Является ли сценарий тем, где вы его ожидаете? В конечном счете, вы должны быть в состоянии диагностировать это, распечатав путь к классу из вашего кода или просмотрев его в вашем отладчике. Затем, глядя на этот результат и содержимое .jar, он должен быть черно-белым относительно того, что происходит.

4. можете ли вы выполнить f.exists() и проверить, существует ли файл после того, как вы получили его из ресурсов. Кроме того, вы можете сделать jar tf your.jar и подтвердите, существует ли файл в jar. Более того, я не слишком уверен, будет ли вам разрешено выполнять двоичный файл из файла jar без его извлечения. Я бы предложил разместить ваши ресурсы рядом с файлом jar и предоставить ресурс в виде командной строки в jar, а затем запустить вместо того, чтобы связывать его с jar

5. Привет, Стив, да, у меня есть несколько каталогов в папке ресурсов, и один называется scripts, где у меня есть скрипт. У меня также есть каталог для моих файлов fxml с именем fxml плюс другие, например, значки и т.д. . Я вижу файл внутри jar. Извинения, Стив, однако я не уверен, что вы имеете в виду, распечатывая путь к классу из вашего кода или просматривая его в вашем отладчике, поскольку я новичок, все остальные работают нормально