Как решить проблему удаления Nashorn и замены JS в Netbeans 22?

Несмотря на то, что я выполнил все процедуры точно так, как указано для установки альтернативы 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.com/artifact/org.openjdk.nashorn/nashorn-core‌​/… » найдите jar ссылку для скачивания « repo1.maven.org/maven2/org/openjdk/nashorn/nashorn-core/15. ‌​4/…"

life888888 08.07.2024 05:19

Итак, mvnrepository указывает на OpenJDK Nashorn » 15.4, за которым следуют 5 строк XML-кода. Нужно ли что-то делать с этим кодом, и если да, то что?

Rusty 08.07.2024 05:31

найдите files jar (2.1 MB), нажмите ссылку, скачайте jar-файл. Поместите информацию о jar-файле в каталог вашего приложения (пример: C:\myapp). добавьте полный путь к файлу jar в свой CLASSPATH.

life888888 08.07.2024 05:37

Является ли CLASSPATH тем же, что и PATH, или необходимо создать совершенно новую переменную CLASSPATH, например: setx /M CLASSPATH "C:\MyApp\nashorn-core-15.4"

Rusty 08.07.2024 05:53

«точно так, как указано» — указано где? Ссылка на инструкции, которым вы следовали.

Basil Bourque 08.07.2024 08:11

Используете ли вы систему сборки, например. Мавен или Градл?

jabaa 08.07.2024 09:27

@life88888 Life88888 Та же ошибка после установки ПУТИ К КЛАССУ: -jfx-copylibs: в Java 15 удален Nashorn... Невозможно создать механизм сценариев Javax для Javascript

Rusty 08.07.2024 09:31

@jabaa Нет, я пытался избежать того и другого, они кажутся чрезмерными для того, чем я хочу заниматься, а именно разрабатывать небольшие настольные приложения с помощью JavaFXML. В Netbeans 12 все работало отлично, но в NB22 невозможно обновлять и разрабатывать устаревшие приложения.

Rusty 08.07.2024 09:35

Maven и Gradle — это системы сборки и менеджеры зависимостей. Если я правильно понимаю, вы хотите управлять зависимостью (это обсуждалось в комментариях). В этих системах вам нужно только скопировать и вставить фрагмент XML. Я рекомендую одну из этих систем. «Несмотря на то, что все процедуры были выполнены в точности так, как указано» Можете ли вы разместить ссылку на спецификацию?

jabaa 08.07.2024 09:54

Это была спецификация, описанная в docs.oracle.com/en/graalvm/jdk/22/docs/getting-started/…. Что касается упомянутого вами фрагмента, откуда его копировать и куда/во что он вставляется?

Rusty 08.07.2024 11:11

Что вы видите в NetBeans, когда вы переходите в пункт меню «Инструменты» > «Платформы Java»? Вам нужно добавить платформу GraalVM («Добавить платформу»), а затем выбрать ее в NetBeans?

andrewJames 08.07.2024 21:01

Я вижу JDK 22 (по умолчанию). При нажатии «Добавить платформу» я вижу три переключателя «Java SE», «Удаленный Java SE» и «Загрузить OpenJDK». Какой из них мне выбрать?

Rusty 09.07.2024 11:14

@Rusty - У вас есть ограничения и вы должны использовать graalvm? Приемлемы ли другие JDK?

life888888 09.07.2024 14:20

Нажмите «Java Standard Edition», затем перейдите к папке, в которой установлен Graal, и выберите ее.

andrewJames 09.07.2024 14:40

В проекте Java в NetBeans вам также необходимо сообщить проекту, что вы хотите использовать эту конкретную платформу Java: убедитесь, что вы уже находитесь в проекте, а затем перейдите в меню «Файл» > «Свойства проекта» > «Сборка» > «Компиляция» > «Платформа Java». Выберите платформу Graal.

andrewJames 09.07.2024 14:43

После этого вам, кстати, захочется заглянуть в Graal Truffle. Это не Нашорн - это альтернатива Нашорну , тоже с "режимом совместимости". Больше инструкций здесь.

andrewJames 09.07.2024 14:47

@life888888 Не ограничивается граалем или чем-то еще, просто полностью и совершенно запутался. Просто хочу встать и поработать.

Rusty 10.07.2024 02:38

До сих пор я пробовал Zulu-22.30.13, Openjfx-22-0-1 с модами, Openjfx-22-0-1 bin, graalvm-jdk-22 win64 и nashorn-core-15.4, но безуспешно. Осталось что-нибудь попробовать? Если решения просто нет, я бы предпочел знать, а затем попробовать заняться чем-то другим.

Rusty 10.07.2024 02:57

@andrew.james «Нажмите «Java Standard Edition», а затем перейдите к папке, в которой установлен Graal» не имеет никакого эффекта, и сообщение компилятора «Java 15 удалил Nashorn, вы должны предоставить движок для запуска JavaScript самостоятельно. GraalVM JavaScript в настоящее время является предпочтительным вариантом». все еще там.

Rusty 10.07.2024 04:50

Верно, отсюда и мой комментарий «это не Нашорн». Я думаю, вам не нужен GraalVM в вашем конкретном случае, как отметил @life888888 в своем превосходном ответе. Я надеюсь, что этот подход решит ваши проблемы.

andrewJames 10.07.2024 14:54

@ life888888 Спасибо за блестящий урок, я дошел до Create Script Engine, и, поскольку это новая область, я хочу внимательно ее изучить. До сих пор все работает. Я обнаружил один недостающий шаг — Config JavaFX, где я нашел плагин в разделе «Доступные плагины», а затем процедура следовала вашей последовательности, как описано. Я вернусь, когда изучу Script Engine и заставлю его работать. Спасибо за значительную помощь.

Rusty 11.07.2024 00:52

Успех, еще раз спасибо, заставил меня продвинуться дальше по кривой обучения.

Rusty 11.07.2024 09:41

@Rusty - Когда я изучал Script Engine, графический интерфейс не был нужен. Самый простой способ — написать короткую тестовую программу в основном методе, а затем System.out.println.

life888888 11.07.2024 15:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
23
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это всего лишь пример Java + JavaFX + nashorn Script Engine.

Если вы хотите интегрировать JavaScript GraalVM, это должен быть другой ответ. ( https://github.com/graalvm/polyglot-embedding-demo) только GraalVM, без JavaFX.

Удалить или удалить все

  • Удалите или удалите JDK, JavaFX, Netbeans...
  • Удалить переменную среды JAVA_HOME

Установите Zulu JDK, включая JavaFX.

https://www.azul.com/downloads/?version=java-21-lts&os=windows&architecture=x86-64-bit&package=jdk-fx#zulu

Скачать -> .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.

Потому что программа установки была настроена автоматически.

Проверьте установку JDK

Откройте 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)

Установите Netbeans 22.

Обратите внимание: для установки используйте exe, а не zip.

нажмите Apache-NetBeans-22-bin-windows-x64.exe

NetBeans обнаружит Zulu-21

нажмите Next

Нажмите Install

Конфигурация JavaFX

Меню Tools -> Options

Нажмите Next

Выберите accept the terms in all of the license agreements.

Нажмите Install

Нажмите Finish

Нажмите OK

Создать пример JavaFX

File -> New Project...

  • Категории -> Java with Maven
  • Проекты -> FXML JavaFX Maven Archetype

Нажмите Next

  • Имя проекта: hello1fx
  • Идентификатор группы: com.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

pom.xml

<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>
  • Добавить ядро ​​Nashorn для Script Engine.
  • Измените версию javafx-xxx с 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>

первичный.fxml

<?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>

модуль-info.java

  • ДОБАВИТЬ 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;
}

Приложение.java

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();
    }

}

Первичныйконтроллер.java

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).

Другие вопросы по теме