Tagged: launch4j

Код Java в bat-файле

Маленькая забавность о том, как использовать все возможности Java в обычных bat-скриптах. Или сделать скриптовый язык из Java.

Далее рассказан простой способ скомпилировать и запустить Java код, который находится внутри bat-файла.

Навеяно статьёй Код С# в bat-файле. Я реализовал тоже самое для Java. Только я не стал делать поиск папки в которую установлен JDK, т.е. в переменной %PATH% должен быть указан путь к %JDK_HOME%/bin

Не буду долго томить, вот код bat файла Test.bat:

/*
copy %0 .\%~n0.java
javac %~n0.java
cls
java %~n0
del %~n0.class
del %~n0.java
exit
*/

public class Test {
 public static void main(String[] args) throws Exception {
  System.out.println("Hello world from Java!");
  System.out.println("Press Enter to exit");
  System.in.read();
 }
}

Выполнив полученный батник увидим:

Работает это так:

  1. Сначала работает bat-интерпретатор. Первую строчку скрипта (комментарий Java /*) он не понимает и выдает ошибку. Но не страшно, это чисто визуальное неудобство.
  2. Затем мы копируем бат файл в файл с таким же именем но уже с расширением *.java, иначе компилятор javac откажется его компилировать. Выражение %~n0 вернёт имя файла без расширения: параметр 0 всегда имя файла а квалификатор n только имя файла. Следите за названием файла, поскольку имя *.java файла должно соответствовать имени класса внутри него.
  3. Далее компилируем консольным компилятором javac который в качестве аргумента принимает путь к файлу с исходником. В нашем случае исходник находится в теле bat-файла (строки 10–18). Текст bat-команд игнорируется, как комментарий (строки 1 и 9).
  4. После работы компилятора, получаем class файл, который запускаем (предварительно подчистив экран командой cls) и удаляем после завершения его работы.
  5. Работа bat-интерпретатора заканчивается на 8 строке (exit).

Если есть трудности с синтаксисом bat скриптов могу посоветовать хорошую статью.

Это был пример, я использую ещё немного улучшенный вариант bat файла. В случае ошибок компиляции он их выведет. Ещё также он добавит в CLASSPATH все *.jar файлы которые он найдёт рядом.

/*
@echo off
copy %0 .\%~n0.java
cls
javac -classpath CLASSPATH=.\*.jar;.\lib\*.jar  %~n0.java
if %ERRORLEVEL% equ 0 (
 cls
 java %~n0
 del %~n0.class
)
del %~n0.java
exit
*/

public class Test {
 public static void main(String[] args) throws Exception {
  System.out.println("Hello world from Java!");
  System.out.println("Press Enter to exit...");
  System.in.read();
 }
}

Целесообразность, скорее just for fun. Но иногда бывает удобнее выслать новичку один файл, уже с прописанной строчкой компиляции, который нужно просто выполнить.

UPD

Узнал о библиотеке Launch4j которая может превратить ваш jar файл в обычный запускаемый exe