Несмотря на то, что я выполнил все процедуры точно так, как указано для установки альтернативы Nashorn в Netbeans 22, я все равно получаю следующую ошибку при попытке построить проект FXML:
Java 15 has removed Nashorn, you must provide an engine for running JavaScript yourself.
GraalVM JavaScript — это js, который я пытаюсь интегрировать. Следуя странице Oracle graalvm, я скачал и извлек следующее:
https://download.oracle.com/graalvm/22/latest/graalvm-jdk-22_windows-x64_bin.zip
Извлек загрузку в каталог C:Program Files/Java/graalvm-jdk-22.0.1+8.1
и переименовал папку graalvm-22
В оболочке администратора cmd установите переменную среды JAVA_HOME с помощью:
setx /M JAVA_HOME "C:\Progra~1\Java\graalvm-22"
и установите путь с помощью:
setx /M PATH "C:\Progra~1\Java\<graalvm>\bin;%PATH%"
Проверил эти переменные с помощью echo, которое показало:
echo %JAVA_HOME%
C:\Progra~1\Java\graalvm-22
echo %PATH%
C:\Progra~1\Java\graalvm-22\bin;
C:\Program Files\CommonFiles\Oracle\Java\javapath;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\WINDOWS\System32\OpenSSH\;
C:\Program Files\HP\HP One Agent;C:\Users\qabpa\AppData\Local\Microsoft\WindowsApps;
Я застрял в этой проблеме на несколько дней и был бы признателен за помощь. Спасибо.
Итак, mvnrepository указывает на OpenJDK Nashorn » 15.4, за которым следуют 5 строк XML-кода. Нужно ли что-то делать с этим кодом, и если да, то что?
найдите files jar (2.1 MB), нажмите ссылку, скачайте jar-файл. Поместите информацию о jar-файле в каталог вашего приложения (пример: C:\myapp). добавьте полный путь к файлу jar в свой CLASSPATH.
Является ли CLASSPATH тем же, что и PATH, или необходимо создать совершенно новую переменную CLASSPATH, например: setx /M CLASSPATH "C:\MyApp\nashorn-core-15.4"
«точно так, как указано» — указано где? Ссылка на инструкции, которым вы следовали.
Используете ли вы систему сборки, например. Мавен или Градл?
@life88888 Life88888 Та же ошибка после установки ПУТИ К КЛАССУ: -jfx-copylibs: в Java 15 удален Nashorn... Невозможно создать механизм сценариев Javax для Javascript
@jabaa Нет, я пытался избежать того и другого, они кажутся чрезмерными для того, чем я хочу заниматься, а именно разрабатывать небольшие настольные приложения с помощью JavaFXML. В Netbeans 12 все работало отлично, но в NB22 невозможно обновлять и разрабатывать устаревшие приложения.
Maven и Gradle — это системы сборки и менеджеры зависимостей. Если я правильно понимаю, вы хотите управлять зависимостью (это обсуждалось в комментариях). В этих системах вам нужно только скопировать и вставить фрагмент XML. Я рекомендую одну из этих систем. «Несмотря на то, что все процедуры были выполнены в точности так, как указано» Можете ли вы разместить ссылку на спецификацию?
Это была спецификация, описанная в docs.oracle.com/en/graalvm/jdk/22/docs/getting-started/…. Что касается упомянутого вами фрагмента, откуда его копировать и куда/во что он вставляется?
Что вы видите в NetBeans, когда вы переходите в пункт меню «Инструменты» > «Платформы Java»? Вам нужно добавить платформу GraalVM («Добавить платформу»), а затем выбрать ее в NetBeans?
Я вижу JDK 22 (по умолчанию). При нажатии «Добавить платформу» я вижу три переключателя «Java SE», «Удаленный Java SE» и «Загрузить OpenJDK». Какой из них мне выбрать?
@Rusty - У вас есть ограничения и вы должны использовать graalvm? Приемлемы ли другие JDK?
Нажмите «Java Standard Edition», затем перейдите к папке, в которой установлен Graal, и выберите ее.
В проекте Java в NetBeans вам также необходимо сообщить проекту, что вы хотите использовать эту конкретную платформу Java: убедитесь, что вы уже находитесь в проекте, а затем перейдите в меню «Файл» > «Свойства проекта» > «Сборка» > «Компиляция» > «Платформа Java». Выберите платформу Graal.
После этого вам, кстати, захочется заглянуть в Graal Truffle. Это не Нашорн - это альтернатива Нашорну , тоже с "режимом совместимости". Больше инструкций здесь.
@life888888 Не ограничивается граалем или чем-то еще, просто полностью и совершенно запутался. Просто хочу встать и поработать.
До сих пор я пробовал Zulu-22.30.13, Openjfx-22-0-1 с модами, Openjfx-22-0-1 bin, graalvm-jdk-22 win64 и nashorn-core-15.4, но безуспешно. Осталось что-нибудь попробовать? Если решения просто нет, я бы предпочел знать, а затем попробовать заняться чем-то другим.
@andrew.james «Нажмите «Java Standard Edition», а затем перейдите к папке, в которой установлен Graal» не имеет никакого эффекта, и сообщение компилятора «Java 15 удалил Nashorn, вы должны предоставить движок для запуска JavaScript самостоятельно. GraalVM JavaScript в настоящее время является предпочтительным вариантом». все еще там.
Верно, отсюда и мой комментарий «это не Нашорн». Я думаю, вам не нужен GraalVM в вашем конкретном случае, как отметил @life888888 в своем превосходном ответе. Я надеюсь, что этот подход решит ваши проблемы.
@ life888888 Спасибо за блестящий урок, я дошел до Create Script Engine, и, поскольку это новая область, я хочу внимательно ее изучить. До сих пор все работает. Я обнаружил один недостающий шаг — Config JavaFX, где я нашел плагин в разделе «Доступные плагины», а затем процедура следовала вашей последовательности, как описано. Я вернусь, когда изучу Script Engine и заставлю его работать. Спасибо за значительную помощь.
Успех, еще раз спасибо, заставил меня продвинуться дальше по кривой обучения.
@Rusty - Когда я изучал Script Engine, графический интерфейс не был нужен. Самый простой способ — написать короткую тестовую программу в основном методе, а затем System.out.println.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это всего лишь пример Java + JavaFX + nashorn Script Engine.
Если вы хотите интегрировать JavaScript GraalVM, это должен быть другой ответ. ( https://github.com/graalvm/polyglot-embedding-demo) только GraalVM, без JavaFX.
Скачать -> .msi
zulu21.34.19-ca-fx-jdk21.0.3-win_x64.msi
нажмите zulu21.34.19-ca-fx-jdk21.0.3-win_x64.msi
Раскрывающийся список Set JAVA_HOME variable, выберите Entire feature will be installed on local hard drive
Нажмите Next
Обратите внимание, что вам не нужно самостоятельно устанавливать переменные среды JAVA_HOME или PATH.
Потому что программа установки была настроена автоматически.
Откройте CMD, введите команду javac -version
javac 21.0.3
введите другую команду: java -version
openjdk version "21.0.3" 2024-04-16 LTS
OpenJDK Runtime Environment Zulu21.34+19-CA (build 21.0.3+9-LTS)
OpenJDK 64-Bit Server VM Zulu21.34+19-CA (build 21.0.3+9-LTS, mixed mode, sharing)
Обратите внимание: для установки используйте exe, а не zip.
нажмите Apache-NetBeans-22-bin-windows-x64.exe
NetBeans обнаружит Zulu-21
нажмите Next
Нажмите Install
Меню Tools -> Options
Нажмите Next
Выберите accept the terms in all of the license agreements.
Нажмите Install
Нажмите Finish
Нажмите OK
File -> New Project...
Java with MavenFXML JavaFX Maven ArchetypeНажмите Next
hello1fxcom.exmapleНажмите Finish
Нажмите значок (Выполнить)
Затем появится окно javafx.
hello1fx
├── nbactions.xml
├── pom.xml
└── src
├── main
│ ├── java
│ │ ├── com
│ │ │ └── example
│ │ │ └── hello1fx
│ │ │ ├── App.java
│ │ │ └── PrimaryController.java
│ │ └── module-info.java
│ └── resources
│ └── com
│ └── example
│ └── hello1fx
│ └── primary.fxml
└── test
└── java
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hello1fx</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>21</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>21</version>
</dependency>
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.4</version>
<configuration>
<mainClass>com.example.hello1fx.App</mainClass>
</configuration>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
</execution>
<execution>
<!-- Configuration for manual attach debugging -->
<!-- Usage: mvn clean javafx:run@debug -->
<id>debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE debugging -->
<id>ide-debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE profiling -->
<id>ide-profile</id>
<configuration>
<options>
<option>${profiler.jvmargs.arg1}</option>
<option>${profiler.jvmargs.arg2}</option>
<option>${profiler.jvmargs.arg3}</option>
<option>${profiler.jvmargs.arg4}</option>
<option>${profiler.jvmargs.arg5}</option>
</options>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
13 на 21. <dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>21</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>21</version>
</dependency>
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.4</version>
</dependency>
<?xml version = "1.0" encoding = "UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>
<VBox alignment = "CENTER" spacing = "20.0" xmlns = "http://javafx.com/javafx/8.0.171" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "com.example.hello1fx.PrimaryController">
<children>
<TextArea fx:id = "inputArea" text = "" promptText = "Enter your script here..." />
<Button fx:id = "runButton" text = "run" onAction = "#execRun"/>
<Button fx:id = "cleanButton" text = "clean" onAction = "#execClean"/>
<TextArea fx:id = "outputArea" text = "" editable = "false" />
</children>
</VBox>
requires java.scripting;requires jdk.dynalink;module com.example.hello1fx {
requires javafx.controls;
requires javafx.fxml;
requires java.scripting;
requires jdk.dynalink;
opens com.example.hello1fx to javafx.fxml;
exports com.example.hello1fx;
}
package com.example.hello1fx;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
/**
* JavaFX App
*/
public class App extends Application {
private static Scene scene;
@Override
public void start(Stage stage) throws IOException {
scene = new Scene(loadFXML("primary"), 640, 480);
stage.setScene(scene);
stage.setTitle("Nashorn JavaScript Engine");
stage.show();
}
static void setRoot(String fxml) throws IOException {
scene.setRoot(loadFXML(fxml));
}
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
public static void main(String[] args) {
launch();
}
}
package com.example.hello1fx;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.PrintWriter;
import java.io.StringWriter;
public class PrimaryController {
ScriptEngineManager manager ;
ScriptEngine engine;
@FXML
private TextArea inputArea;
@FXML
private TextArea outputArea;
@FXML
private void execRun() throws IOException {
manager = new ScriptEngineManager();
engine = manager.getEngineByName("nashorn");
StringWriter writer = new StringWriter();
engine.getContext().setWriter(writer);
try {
String inputText = inputArea.getText();
System.out.println(">>> inputText = "+inputText);
engine.eval(inputText );
System.out.println(">>> OK");
outputArea.setText( "Processed: \n"+writer.toString());
System.out.println(">>> set output OK");
} catch (ScriptException e1) {
e1.printStackTrace(new PrintWriter(writer));
}
}
@FXML
private void execClean() throws IOException {
inputArea.clear();
outputArea.clear();
}
}
Нажмите значок «Выполнить еще раз».
в (1) область ввода поместите код Java-скрипта.
print('Hello World!')
print(100 + 200)
Нажмите кнопку run (3)
Затем покажите результат в (2)
Вы можете нажать кнопку clean (4), чтобы очистить (1) и (2).
«mvnrepository.com/artifact/org.openjdk.nashorn/nashorn-core/… » найдите
jarссылку для скачивания « repo1.maven.org/maven2/org/openjdk/nashorn/nashorn-core/15. 4/…"