Как связать JavaFX SDK непосредственно в выходном фляге? - PullRequest
4 голосов
/ 29 января 2020

В настоящее время я использую аргумент JVM при запуске своей программы, чтобы найти библиотеки JavaFX, например:

java -javaagent:lib/aspectjweaver-1.9.5.jar -javaagent:lib/spring-instrument-5.2.3.RELEASE.jar --module-path lib/javafx-sdk-13.0.2/lib --add-modules=javafx.controls -jar target/Some_Service-1.0.jar

Мой модуль POM. Раздел плагинов xml чрезвычайно прост. Помимо плагинов Docker и Launch4j, у меня есть только следующее:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Есть ли способ сказать Maven, что нужно связать весь каталог lib (который содержит библиотеки JavaFX и инструмент aspectJ / spring java) агенты) прямо в банке? Это решило бы проблему переноса этой папки lib везде, где я развертывал свое приложение! Спасибо!

****** РЕДАКТИРОВАТЬ ******

Я возился с опциями плагина maven с пружинной загрузкой, и, к сожалению, моя банка по-прежнему не содержит мою папку:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <folders>
            <folder>lib</folder>
        </folders>
        <agent>lib/aspectjweaver-1.9.5.jar</agent>
        <agent>lib/spring-instrument-5.2.3.RELEASE.jar</agent>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

****** РЕДАКТИРОВАТЬ 2 ******

Я только что нашел потрясающую библиотеку, которая полностью исключает необходимость использования параметров -javaagent, поскольку вы загружаете их программно во время выполнения вместо. Похоже, само присутствие AspectJ и Spring-Instrument на моем classpath - это все, что ему нужно! Проверьте это: https://github.com/subes/invesdwin-instrument.

Все, что мне сейчас нужно, это каким-то образом связать среду выполнения JavaFX в мой jar вместо внешней ссылки на нее с помощью аргумента командной строки.

1 Ответ

1 голос
/ 26 февраля 2020

Вместо использования JavaFX SDK объявите свою зависимость от JavaFX в своем файле pom.xml. Затем вы можете использовать maven-shade-plugin для создания исполняемого JAR-файла fat / uber. Соответствующие JAR-файлы JavaFX (например, графический JAR-файл), загруженные из Maven Central, содержат необходимый специфичный для платформы c собственный код, который будет извлечен во время выполнения (например, в домашний каталог пользователя).

Вот минимальный пример:

Launcher. java:

package com.example;

import javafx.application.Application;

public class Launcher {

  public static void main(String[] args) {
    Application.launch(App.class, args);
  }
}

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

package com.example;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

  @Override
  public void start(Stage primaryStage) {
    StackPane root = new StackPane(new Label("Hello, World!"));
    primaryStage.setScene(new Scene(root, 500, 300));
    primaryStage.show();
  }
}

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>javafx-uber-jar</artifactId>
    <version>1.0</version>

    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>13</maven.compiler.source>
      <maven.compiler.target>13</maven.compiler.target>
    </properties>

    <build>
      <plugins>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
              <release>13</release>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.2.2</version>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>shade</goal>
              </goals>
              <configuration>
                <transformers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <mainClass>com.example.Launcher</mainClass>
                  </transformer>
                </transformers>
              </configuration>
            </execution>
          </executions>
        </plugin>

      </plugins>
    </build>

    <dependencies>
      <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>13.0.2</version>
      </dependency>
    </dependencies>

</project>

Командная строка:

mvn package

Приведенное выше описание создаст platform- Speci c Uber JAR. В этом ответе приведены идеи о том, как создать кроссплатформенный UAR JAR.

В зависимости от версии Java, которую вы используете для разработки своего приложения, вы можете изучить jlink (Java 9+) и / или jpackage (Java 14, ранний доступ) в качестве альтернативы созданию JAR-файла fat / uber. Если вы используете один из них, рассмотрите возможность использования JMOD файлов JavaFX (может быть , найденных здесь ), так как он настраивает пользовательское изображение для лучшей обработки нативного кода (т.е. без извлечения).


Обратите внимание, что основной класс не является подклассом Application. Это обязательно для приложений, которые помещают библиотеки JavaFX в classpath , по крайней мере для JavaFX 9-13. Причина этого требования связана с реализацией, позволяющей приложениям JavaFX не иметь основного метода; если модуль javafx.graphics не находится на modulepath , предполагается, что «отсутствуют компоненты JavaFX». Но это происходит только тогда, когда основной класс и класс Application совпадают, следовательно, вышеупомянутый обходной путь.

...