Описание запуска HelloWorld из примера, предложенного Oracle в «Getting Started with JavaFX», но безыдейно, то есть, без IntelliJ IDEA и вообще какой-либо IDE. Реализовано на ПК с Windows. Опус относится к классу «Чайник — чайнику». Внезапно оказалось, что для компиляции и запуска простейшего приложения из командной строки недостаточно информации туториала, в котором приведен код этого приложения.
Человеку опытному такие записки могут показаться забавными. Однако, тем, кто только подошел к полю, усеянному граблями, подобный путеводитель может быть полезным.
Спросите — зачем, собственно? Для обучения, как и все HelloWorld`ы. Не хочу умалять значения IDE и заявлять: «Только блокнот! Только хардкор!» Но командная строка позволяет если и не понять всю механику, то хотя бы заглянуть под капот. Особенно когда некоторый опыт программирования за еду уже есть. Внезапно возникло желание расширить горизонты и освоить, ну, допустим, Java. По крайней мере, попробовать.
Есть совершенно замечательный пост Работа с Java в командной строке от Qwertovsky. Все же, для дальнейшего погружения маловато голой консоли, хочется окошек. Желательно, в виде десктопного приложения. Почитал, какие есть варианты создания GUI для Java-программ, и что о них думает народ, остановился пока на JavaFX. Оказалось, что на русском в разного рода интернетах про JFX написано довольно мало, и существенной частью про первую версию. Значит, придется рыть на сайте Oracle.
jfxpub-overview сообщает нам, что, поскольку JavaFX-приложения пишутся на языке Java, я могу использовать для их создания свой любимый редактор или какую-нибудь IDE (NetBeans, Eclipse или IntelliJ IDEA). Предлагается заглянуть на сайт www.oracle.com и скачать Oracle® JDK 7 с поддержкой JavaFX 2.2.n, а потом воспользоваться пособием jfxpub-get_started, чтобы создать простое приложение, демонстрирующее работу со слоями, таблицами стилей и визуальными эффектами. Еще там предлагается использовать JavaFX Scene Builder для разработки пользовательского интерфейса без кодинга, но это как-нибудь потом.
Установлен JDK и (на всякий случай) JRE. У меня в системную переменную PATH само ничего не прописалось, и я вручную прописывать не стал.
Берем упомянутый пример как есть.
package helloworld;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
Авторы пособия предлагают использовать NetBeans IDE 7.3. Обойдемся. Делаем папку для проекта, допустим, D:GetStart, в ней создаем папку для исходников src и папку для результатов компиляции out. Раз уж пробный класс относится к пакету helloworld, надо сделать одноименную папку в src и положить туда файл HelloWorld.java.
Чтобы это компилировалось, сделаем в корне проекта файл compile.cmd. Так удобнее вносить правки в команду компиляции — не надо полагаться на память интерпретатора командной строки, и вообще, можно обойтись без cmd.exe, пользоваться любимым файловым менеджером, а хоть бы и проводником.
jfxpub-overview рассказал, что JavaFX полностью встроен в Java SE 7 JRE и JDK. На странице downloads желающим скачать JavaFX для Java SE 7 предлагают просто скачать Java SE 7. Среди файлов JDK нет javafxc и javafx. По всей видимости, скомпилировать JFX-приложение можно так же, как и любой другой java-файл. Поэтому в командный файл запишем две строчки:
@"C:Program FilesJavajdk1.7.0_40binjavac" -d out srchelloworldHelloWorld.java
@pause
Вторая строчка дает возможность рассмотреть сообщения об ошибках. Если же в появившемся окне cmd.exe будет единственное сообщение «Для продолжения нажмите любую клавишу...», значит, предыдущая команда выполнена без ошибок.
Однако, запуск выдаст длинную простыню, которая, вероятно, вся даже не влезет в окно вывода. 18 ошибок, что-то не найдено, что-то не существует. Чтобы посмотреть все сообщения полностью, можно первую строчку CMD-файла дополнить перенаправлением потока вывода ошибок в файл «2> result.txt».
srchelloworldHelloWorld.java:3: error: package javafx.application does not exist
import javafx.application.Application;
^
srchelloworldHelloWorld.java:4: error: package javafx.event does not exist
import javafx.event.ActionEvent;
^
...
symbol: class Scene
location: class HelloWorld
srchelloworldHelloWorld.java:15: error: method does not override or implement a method from a supertype
@Override
^
18 errors
Компилятор не может найти пакеты JFX. Надо ему подсказать, а для этого надо узнать самому. Может быть, я не очень внимательно рылся, но на сайте Oracle не нашел, точнее, нашел только на форуме. Искомый файл — jfxrt.jar (логично — JavaFX Run Time), и он лежит в JRE, то есть, у меня, например, в C:Program FilesJavajre7lib и C:Program FilesJavajdk1.7.0_40jrelib. Добавим опцию -classpath:
@"C:Program FilesJavajdk1.7.0_40binjavac" -d out -classpath "C:Program FilesJavajre7libjfxrt.jar" srchelloworldHelloWorld.java
@pause
Теперь компилируется. Создалась папка ./out/helloworld, и в ней файл HelloWorld.class. Если баловства ради в файле .java переименовать пакет в package HelloWorld, то и папка создастся в соответствующем регистре — ./out/HelloWorld, вот только приложение не запустится.
Хотелось бы запустить. В упомянутой теме на форуме Oracle предлагается вариант с упаковкой в jar, но попробуем сначала запустить так. Сделаем еще командный файл run.cmd с заранее указанной библиотекой JFX:
@"C:Program FilesJavajdk1.7.0_40binjava" -classpath "C:Program FilesJavajre7libjfxrt.jar" helloworld.HelloWorld
@pause
При запуске получим ошибку:
Error: Could not find or load main class helloworld.HelloWorld
Ну что ж, значит, classpath еще маловат, надо указать и место жительства нашего откомпилированного класса:
@"C:Program FilesJavajdk1.7.0_40binjava" -classpath "C:Program FilesJavajre7libjfxrt.jar;.out" helloworld.HelloWorld
@pause
Запуск этой команды наконец-то приведет к появлению окошка с кнопкой с иллюстрации get_started. При этом будет видна и консоль cmd.exe. Нажатие на кнопку в окошке приведет к появлению сообщения «Hello World!» в консоли.
Упаковать в jar все-таки хотелось бы. Воспользуемся утилитой javafxpackager. Запущенная в консоли без параметров, она выдает довольно подробную и понятную справку по своим опциям. Можно сделать файл jar.cmd:
@"C:Program FilesJavajdk1.7.0_40binjavafxpackager" -createjar -appclass helloworld.HelloWorld -srcdir .out -outfile HelloWorld -v
@pause
Из проводника получившийся jar у меня запускается двойным щелчком мышки. Однако, файловый менеджер заходит в этот файл, как в архив (коим файл, собственно, и является). Кроме того, в проводнике файл запускается без консоли. Поэтому для удобства я добавил еще и run_jar.cmd:
@"C:Program FilesJavajre7binjava.exe" -jar HelloWorld.jar
@pause
Работает!
Далее в руководстве предлагается сделать окно ввода логина и пароля с целью обучения основам размещения элементов, потом из этого окна делается стильная красотулечка с использованием каскадных таблиц стилей (CSS), затем рисуется эта же форма, но с помощью FXML. Во всех этих действиях разбросано немножечко грабель. Ничего особенно сложного — просто неочевидности, о которых в руководстве не сказано, а программу в результате не откомпилировать или не запустить.
Автор: RomeoGolf