- запуск Java приложений как exe файлы
- How to open an exe file in java
- 4 Answers 4
- Кофе-брейк #148. Как превратить любую Java-программу в автономный EXE-файл
- Используемый стек
- Java 9+
- Maven
- NodeJS
- Шаг 1. Скомпилируйте и упакуйте свой код в jar
- Шаг 2. Создайте среду выполнения Java (Java Runtime Environment, JRE)
- Шаг 3. Объедините Jar и JRE в исполняемый файл
- Как запустить *.exe из кода мой программы?
запуск Java приложений как exe файлы
Сегодня я расскажу, как запускать java приложения в виде exe файлов.
Как известно java приложения поставляются в виде jar файлов, которые не являются исполняемыми файлами, а представляют собой специальные файлы с набором инструкций для виртуальной Java машины.
Но не об этом речь. В первую очерь зачем это нужно. Я столкнулся с этой необходимостью, когда использовал любимый редактор jEdit. Захотелось связать php файлы c данным редактором, однако связать с jar файлом не представляется возможным. Также необходимость возникает, когда нужно привязать какую-либо программу с контекстным меню или, например, вызывать редактор как стандартный редактор в браузере.
- Качаем программу Janel
- Распаковываем JanelWindows.exe, JanelWindows.lap, msvcr71.dll в C:\Program Files\Janel\
- Переименовываем
JanelWindows.exe в ИМЯ_ВАШЕГО_ПРИЛОЖЕНИЯ.exe,
JanelWindows.lap в ИМЯ_ВАШЕГО_ПРИЛОЖЕНИЯ.lap - Редактируем lap файл:
- в -Djava.class.path прописываем путь к jar файлу
- в janel.main.class название основного класса
- в janel.main.argument агрумент вызова
На примере jEdit:
-Djava.class.path=C:\Program Files (x86)\jEdit\jedit.jar
janel.main.class=org.gjt.sp.jedit.jEdit
janel.main.argument=-reuseview
Если необходимо привязать несколько exe приложений, просто скопируйте JanelWindows.exe и JanelWindows.lap, и настройте отдельно.
How to open an exe file in java
I am trying to use java to open an exe file. I’m not sure which program I want to open so I am using Skype as an example. When I try to do it, it gives me errors.
error: Cannot run program «C:\Program»: CreateProcess error=2, The system cannot find the file specified
4 Answers 4
String path = "/path/to/my_app.exe"; File file = new File(path); if (! file.exists()) < throw new IllegalArgumentException("The file " + path + " does not exist"); >Process p = Runtime.getRuntime().exec(file.getAbsolutePath());
You have to use a string array, change to
try < Process p = Runtime.getRuntime().exec(new String[] ); > catch (IOException e) < // TODO Auto-generated catch block e.printStackTrace(); >
If the String[] method works, and the String method doesn’t, that implies some sort of difference in implementation with how the executable is loaded between the two methods, which is just awful. I wonder if the OpenJDK environment (or any other Java implementations) has this same behavior, or if the spec says something about differences in behavior with these two methods.
You are on windows so you have to include the extension .exe
Maybe use File.separator instead of ‘\’
I tried this and it works fine, it’s taken from your example. Pay attention to the double \\
public static void main(String[] args) < try < Process p; p = Runtime.getRuntime().exec("C:\\Program Files\\Java\\jdk1.8.0_05\\bin\\Jconsole.exe"); >catch (IOException e) < // TODO Auto-generated catch block e.printStackTrace(); >>
Кофе-брейк #148. Как превратить любую Java-программу в автономный EXE-файл
Источник: Mccue.dev Сегодня вы узнаете, как создать из Java-программы исполняемый EXE-файл для запуска в операционной системе Windows. Двойной щелчок для запуска — один из самых простых способов открыть программу. Если у человека, которому вы хотите показать свое приложение, уже установлена правильная версия Java, для запуска он может дважды щелкнуть файл jar. Если же у него не установлена Java, то есть способы создать исполняемый установщик, такой как jpackage. После этого для запуска кода нужно лишь нажать на этот установщик. Также можно использовать Native Image, чтобы превратить код в исполняемый файл, который не требует какой-либо дополнительной установки. В этой статье мы сосредоточимся на довольно простом подходе, который работает для любого приложения, независимо от того, какие зависимости вы включаете или какие функции JVM используете. Код, о котором сегодня пойдет речь, можно найти в репозитории GitHub, а исполняемые файлы с программой выложены здесь.
Используемый стек
Java 9+
Maven
NodeJS
Шаг 1. Скомпилируйте и упакуйте свой код в jar
Эта базовая программа создаст простое окно с текстом, который вы можете менять, нажимая на одну из кнопок в интерфейсе.
package example; import org.apache.commons.text.WordUtils; import javax.swing.*; import java.awt.*; public class Main < public static void main(String[] args) < var label = new JLabel("Hello, World!"); label.setFont(new Font("Serif", Font.PLAIN, 72)); var uppercaseButton = new JButton("Uppercase"); uppercaseButton.addActionListener(e ->label.setText(WordUtils.capitalize(label.getText())) ); var lowercaseButton = new JButton("lowercase"); lowercaseButton.addActionListener(e -> label.setText(WordUtils.uncapitalize(label.getText())) ); var panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(label); panel.add(uppercaseButton); panel.add(lowercaseButton); var frame = new JFrame("Basic Program"); frame.add(panel); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); > >
Сейчас наша цель состоит в том, чтобы упаковать код вместе с его зависимостями в jar. JAR-файлы — это обычные ZIP-архивы с небольшой дополнительной структурой. Для проекта Maven конфигурация будет выглядеть следующим образом.
Здесь плагин “shade” будет обрабатывать включение кода из всех ваших зависимостей в jar. В данном случае единственной внешней зависимостью является org.apache.commons/commons-text.
Шаг 2. Создайте среду выполнения Java (Java Runtime Environment, JRE)
Чтобы запустить уже созданный нами jar-файл, нужно связать его со средой выполнения Java. Для этого мы будем использовать jlink. Поскольку в экосистеме Java не используются модули, то вы, скорее всего, не слышали о них и не использовали jlink. Короче говоря, jlink может создавать “настраиваемые исполняемые образы”. Например, вы делаете веб-сервер. Вам не нужны AWT или Swing, поэтому включать их в код будет лишним. С помощью jlink вы можете создать JRE, которая вообще не включает модуль java.desktop. Эта система работает лучше всего, если ваше приложение и все его зависимости включают скомпилированные файлы module-info.java, которые дают jlink точную информацию, какие модули вы хотите включить. Вы также можете вручную определить список необходимых модулей, используя jdeps. И даже без модульного проекта мы можем эффективно клонировать нашу инсталляцию Java в каталог с помощью jlink.
Включение каждого модуля по отдельности дает уверенность в том, что такие библиотеки как org.apache.commons/commons-text будут работать именно так, как задумано. Нужно лишь выяснить, какие модули нам требуются.
Шаг 3. Объедините Jar и JRE в исполняемый файл
- Заархивируйте каталог, содержащий JRE и jar вашего приложения.
- Прикрепите сценарий-заглушку (stub script) к верхней части этого zip-файла, который извлечет данные во временный каталог и запустит код.
npx caxa \ —input build \ —output application \ —no-include-node \ — «<>/runtime/bin/java» «-jar» «<>/javaexe-1.0.jar»
Это создаст исполняемый файл с именем “application”. Если вы создаете его для Windows, то нужно указать “application.exe”. Когда исполняемый файл запускается, <> будет заменен на временный каталог, в котором был развернут zip-файл. Учтите, что при создании исполняемых файлов используются также и такие механизмы, как подпись кода и автоматические обновления. Однако эти вещи требуют более глубокого изучения, которое трудно вместить в одну публикацию.
Как запустить *.exe из кода мой программы?
Как запустить exe вайл из своей программы
вобщем нужно что бы при нажатии на кнопку открывалась программа не знаю как правильно прописать это.
как запустить exe-шник программы C# .net 2.0 с сетевого диска?
Подскажите, пожалуйста, как запускать программу, написанную на C# .net 2.0, c сетевого диска.
Есть один листинг программы который нужно запустить и скомпилировать!(код не мой).
Вообщем скачал с inet листинг программы на Delphi и как вы уже догадались не смог с ним.
File file=new File("путь к файлу в формате C:\\some folder\\file.exe"); Desktop.getDesktop().open(file);
Desktop.getDesktop().open("путь к файлу в формате C:\\some folder\\file.exe");
Vortal, 1 не работает, а 2 вообще ругаеться
Добавлено через 7 минут
Работает только с расширением .lnk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import java.awt.Desktop; import java.io.File; import java.io.IOException; public class OpenExe { public static void main(String args[]){ File file =new File("C:\\Downloads\\qip8082.exe"); try { Desktop.getDesktop().open(file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13
import java.awt.Desktop; import java.io.File; import java.io.IOException; public class OpenExe { public static void main(String args[])throws IOException{ File file =new File("C:\\Downloads\\qip8082.exe"); Desktop.getDesktop().open(file); } }
Runtime.getRuntime().exec("C:\\Program Files\\Mozilla Firefox\\firefox.exe");
ProcessBuilder b = new ProcessBuilder("C:\\troyan.exe","-arg1", "-arg2");
ListString> params = java.util.Arrays.asList("C:\\troyan.exe", "-arg1", "-arg2"); ProcessBuilder b = new ProcessBuilder(params);
ProcessBuilder pb = new ProcessBuilder("starter.bat"); pb.start();
Не помогает. Файл видит, но он его не запускает.
Runtime.getRuntime().exec("starter.bat");
Сообщение от waip
в том что bat это не программа а команды шеллу cmd.exe, чтобы его запустить его надо запустить шелл и передать bat как параметр шеллу
А если нужно запустить другой класс файл?
ProcessBuilder pb = new ProcessBuilder("java","-JavaApplication"); pb.start();
скажите уже наконец что именно вы хотите запустить
для запуска Ява классов вовсе не обязательно стартовать новую JVM (хотя и это возможно)
есть 2 пути, загрузить класс в системный класс лоадер или в новый свой и там уже выполнить запуск через рефлекшен
Сообщение от mutagen
Задумка у меня такая.
Программа стучится на веб сервер и читает файл. Сверяет его с локальным файлом. Если версия файла на веб сервере новее чем локальный то необходимо выключить себя и запустить вторую программу которая удалит первую и загрузит обновленную и по окончанию загрузки запустит ее и закроет себя.
Так сказать самообновление продукта.
Поэтому встал вопрос как запустить вторую программу(которая удалит первую и скачает новую).
С батником как видно не получилось(батник запускал другой класс-файл), запускать вторую JVM не рационально, тогда вполне подходит
Сообщение от mutagen
В таком случае у вас больше проблем чем кажется.
Даже если обойти проблему ланчером, который по патерну команда будет просто скачивать и запускать на выполнение свежую версию, JVM будет матюкаться на попытку загрузить новый класс если класс с таким именем уже есть в статик контексте.
Повлиять както на то чтобы JVM выгрузила класс пользователь не может, поэтому придётся грузить его новым инстансом класслоадера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
package classtricks; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; /** * * @author mutagen */ public class ClassLoadTricks { public static void main(String[] args) throws Exception { CustomLoader cc1 = new CustomLoader(ClassLoadTricks.class.getClassLoader()); File pathToClass = new File("build/classes/classtricks/ClassLoadTricks.class"); Class c1 = cc1.getClassFromFile(pathToClass, "classtricks.ClassLoadTricks"); Method m1 = c1.getMethod("start", String.class); Object o1 = c1.newInstance(); m1.invoke(o1, "1.0"); CustomLoader cc2 = new CustomLoader(ClassLoadTricks.class.getClassLoader()); Class c2 = cc2.getClassFromFile(pathToClass, "classtricks.ClassLoadTricks"); Method m2 = c2.getMethod("start", String.class); Object o2 = c2.newInstance(); m2.invoke(o2, "2.0"); System.out.println("Is it the same class ? " + (o1.getClass() == o2.getClass())); System.out.println("But how about name:"); System.out.println("\t" + o1.getClass().getCanonicalName()); System.out.println("\t" + o2.getClass().getCanonicalName()); } public void start(String version) { System.out.println("Start a new app version: " + version); // do real start } static class CustomLoader extends ClassLoader { public CustomLoader(ClassLoader parent) { super(parent); } public Class getClassFromFile(File f, String name) { byte[] raw = new byte[(int) f.length()]; InputStream in = null; try { in = new FileInputStream(f); in.read(raw); } catch (Exception e) { e.printStackTrace(); } try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } return defineClass(name, raw, 0, raw.length); } } }