Почему JavaFX не может быть упакован с файлом .jar? - PullRequest
1 голос
/ 06 января 2020

У меня была следующая ошибка, когда зависимость json .org не была включена в окончательный файл .jar.

Exception in thread "Thread-2" java.lang.NoClassDefFoundError: org/json/JSONTokener
        at gui.Main.lambda$awake$0(Main.java:91)
        at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.ClassNotFoundException: org.json.JSONTokener
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 2 more

Затем я узнал, что вы можете добавить json .org jar файл как «Извлеченный каталог», который решил мою проблему. После этого я решил попробовать сделать то же самое для JavaFX. При попытке добавить его в качестве «извлеченного каталога» я заметил, что он уже был там указан (как показано на рисунке ниже).

enter image description here

Однако, если я пытаюсь запустить файл jar, используя java -jar [filename].jar, я получаю Error: JavaFX runtime components are missing, and are required to run this application. Я могу запустить его, используя java -jar --module-path /usr/local/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml [filename].jar, но это не должно быть теоретически необходимым. Мне было интересно, если кто-нибудь знает, почему это не работает? Спасибо.

Примечание. Упаковка JavaFX была бы очень полезна, так как это означает, что я могу просто отправить файл .jar, и он будет работать "из коробки" без необходимости установки дополнительных зависимостей.

1 Ответ

1 голос
/ 06 января 2020

Я помню, у меня та же проблема при упаковке проекта JavaFX. И решение заключается в создании толстого фляги (включая все зависимости). Если вы используете maven, вы можете искать 2 ключевых слова: maven-assembly-plugin и maven-dependency-plugin

maven-assembly-plugin помогут вам создать файл толстого фляги

maven-dependency-plugin поможет вам скопировать внешний файл JAR (не управляется репозиторием Maven)

 <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>package.mainclass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
...