Как упаковать приложение javafx11 / jdk11 с помощью NetBeans 10 - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь упаковать приложение javafx, используя javafx11, jdk11 в NetBeans 10, через некоторое время вдали от мира java. Поскольку Javafx был исключен из стандартного jdk, а NetBeans все еще инкубируется в Apache, все немного сложнее, чем раньше.

К счастью, я нашел этот замечательный учебник и этот замечательный ответ , который позволил мне запустить простое приложение Hello World изнутри NetBeans.

Но я не могу заставить его работать за пределами IDE: при вызове с выдаваемой jar jre выдает следующую ошибку:

java.lang.NoClassDefFoundError: javafx/application/Application

Так что, я думаю, мне нужно упаковать среду выполнения javafx в jar, чтобы иметь возможность запустить его, но я не могу понять, как это сделать.

Я нашел несколько указателей, но все они используют командные строки для указания на javafx sdk, но я не нацеливаюсь на машины с установленным на них sdk и хотел бы упаковать все необходимое (кроме самого jre) в jar.

Любая помощь высоко ценится.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Я понял это в немалой степени благодаря неоценимой помощи (и похвальному терпению в его комментариях) Хосе Переда. Поэтому следует отдать ему должное.

Итак, поехали:

Каковы ваши цели

Ваша банка должна соответствовать следующим спецификациям:

  1. он должен содержать javfx jar libs (то есть папки с пакетами, извлеченные из их jar и помещенные в корень вашей).
  2. он должен содержать двоичные библиотеки javafx в корне (* .so для Linux).
  3. он должен (очень важно) иметь модуль запуска: основной класс, который не расширяет «Приложение». Если этого не произойдет, ошибка не будет понятна: она скажет, что не может найти среду выполнения javafx; на самом деле это не проблема.

Теперь, если вы можете сделать это любым способом (Ant, Makefile, пользовательский скрипт, особая функция IDE ...), тогда все будет работать хорошо.

Как это сделать в NetBeans (и других местах, использующих Ant, с небольшими изменениями)

Сначала я создал папку lib в своем проекте и поместил туда libs (это не обязательно, просто проще в моем случае), затем я переопределил цель post-jar в моем build.xml, добавив далее, чтобы создать второй репозиторий dist, который я назвал dist-portable и встроил толстый флягу внутри:

<target name="-post-jar">

<property name="store.jar.name" value="${application.title}${application.desc}-portable"/>
<property name="store.dir" value="dist-portable"/>
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

<echo message="Packaging ${application.title}${application.desc} into a single JAR at ${store.jar}"/>

    <delete dir="${store.dir}"/>
    <mkdir dir="${store.dir}"/>


    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="lib" includes="*.jar"/>
        <fileset dir="lib" includes="*.so"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>

<delete file="${store.dir}/temp_final.jar"/>

</target>

Альтернативное решение

Используйте более продвинутые инструменты сборки, такие как Maven или Gradle. Я не хочу (отсюда и суть моего вопроса), потому что они кажутся слишком сложными, чтобы стоить беспокоиться, учитывая, что я занимаюсь только небольшими проектами.

Более спорным альтернативное решение

Поколение «8» (NetBeans 8, Javafx8 и JDK8) было отличным программным обеспечением и было выпущено не так давно (первая половина 2014 года) и официально поддерживалось вплоть до пары месяцев назад: оно не древний и ... они просто работают из коробки без необходимости что-либо делать. Поколению «11», возможно, придется немного повзрослеть, и я не думаю, что в каждой среде пока что произошел переход на ультрасовременный JDK11. Старые версии все еще можно найти и хорошо работать практически везде, вы можете просто использовать их. Просто имейте в виду, что они больше не обновляются (и это может быть проблемой безопасности).

0 голосов
/ 07 апреля 2019

У меня была такая же проблема месяц назад.Для ее решения я использовал Maven со следующим pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>{your-groupId}</groupId>
<artifactId>{your-artifactId}</artifactId>
<version>0.1-SNAPSHOT</version>

<properties>
    <lwjgl.version>3.2.1</lwjgl.version>
    <joml.version>1.9.12</joml.version>
    <main.class>{your-package-name}.{your-main-class}</main.class>
    <maven.compiler.source>1.11</maven.compiler.source>
    <maven.compiler.target>1.11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!-- // Compiling : $ mvn clean compile assembly:single-->

<build>
    <directory>outputDirectory</directory>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>false</addClasspath>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>${main.class}</mainClass>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java/{your-package-name}</directory>
            <includes>
                <include>sample.fxml</include>
            </includes>
        </resource>
    </resources>
</build>

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-base</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>javax.json</groupId>
        <artifactId>javax.json-api</artifactId>
        <version>1.1.4</version>
    </dependency>
</dependencies>

Список всех доступных артефактов javafx можно найти здесь .

Все, что вам нужно сделать, это:

  • Добавьте pom.xml в ваш проект
  • Убедитесь, что зависимости соответствуют вашим потребностям
  • Импортируйте pom.xml (NetBeans обязательно предложит это вам)
  • Добавьте файл module-info.java.У меня было следующее содержимое:

    module {your-package-name} {
    
        requires javafx.fxml;
        requires javafx.controls;
        requires javafx.graphics;
        requires javafx.base;
        requires javax.json;
        // Change the list to match your dependencies
    
        opens {your-package-name};
    
    }
    
  • Создайте свой jar с помощью NetBeans или с помощью команды mvn compile assembly:single в терминале

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...