Браузер HEAVYWEIGHT не виден на сцене

Я пытаюсь встроить JXBrowser в приложение SpringBoot JavaFX, работающее с Java11. Моя проблема в том, что браузер не отображается на сцене, когда я запускаю приложение из созданного исполняемого файла jar. Браузер загружается, дает обратную связь о загруженном веб-сайте и уже является частью сцены, но не виден. Запуск внутри IntelliJ или с Maven exec в настоящее время работает. Когда я переключаю мод браузера на ЛЕГКИЙ, все три возможности запуска работают нормально. В чем проблема с запуском из jar в моде HEAVYWEIGHT?

Моя система: Windows10-64, Java11, SpringBoot 2.1.0.RELEASE, JXBrowser 6.21, OpenJFX 11

Основной класс

@Slf4j
@SpringBootApplication
public class Main extends Application
{

private ConfigurableApplicationContext springContext;



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



@Override
public void init()
{
    springContext = SpringApplication.run(Main.class);
    springContext.getAutowireCapableBeanFactory().autowireBean(this);
}



@Override
public void start(Stage stage)
{
    final Browser browser = new Browser();
    stage.setScene(new Scene(new BrowserView(browser)));
    stage.show();
    browser.loadURL("http://www.google.de");
}



@Override
public void stop()
{
    springContext.close();
}

}

StartMain.класс

public class StartMain
{
public static void main(String[] args)
{
    Main.main(args);
}

}

пом.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://maven.apache.org/POM/4.0.0"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">

<groupId>de</groupId>
<artifactId>app</artifactId>
<version>1.0.10-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>11</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <jxbrowser.version>6.21</jxbrowser.version>
    <javafx.version>11</javafx.version>
</properties>

<repositories>
    <repository>
        <id>com.teamdev</id>
        <url>http://maven.teamdev.com/repository/products</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.teamdev.jxbrowser</groupId>
        <artifactId>jxbrowser-cross-platform</artifactId>
        <type>pom</type>
        <version>${jxbrowser.version}</version>
    </dependency>
    <dependency>
        <groupId>com.teamdev.jxbrowser</groupId>
        <artifactId>jxbrowser-win64</artifactId>
        <version>${jxbrowser.version}</version>
    </dependency>

    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-base</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>${javafx.version}</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-swing</artifactId>
        <version>${javafx.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
                <mainClass>...StartMain</mainClass>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>build-info</goal>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>


person Moritz    schedule 19.11.2018    source источник


Ответы (1)


Мне удалось собрать проект, и, получив пробную лицензию, я могу его запустить. Как вы упомянули, запуск из IDE или из командной строки mvn compile exec:exec (я также пробовал с Gradle, ./gradlew run, добавляя необходимые --add-exports), работает отлично, браузер отображается и указанный URL-адрес загружается.

Однако, как вы сказали, если вы создадите толстую банку и запустите ее, она не отобразит браузер, но работает JavaFX, и вы можете увидеть, что происходит какая-то активность, только без рендеринга.

Я пробовал под JDK 8, 9, 10 и 11. Только под 8 я смог заставить толстую банку отображать браузер.

Использование толстой банки в целом является плохой практикой, а теперь еще хуже, поскольку вы должны включать классы JavaFX из JavaFX SDK.

Лучше всего распространять ваше приложение с помощью jlink.

Учитывая, что com.teamdev.jxbrowser:jxbrowser не является модульным, вы не можете полностью использовать jlink в своем проекте, но вы можете создать собственный образ среды выполнения только с модулями JavaFX и использовать его для запуска вашего приложения с единственной зависимостью jxBrowser (для удобства я m без использования SpringBoot).

Итак, если вы загружаете jmods JavaFX из здесь, разархивируйте их и запустите:

export PATH_TO_FX_MODS=/path-to/javafx-jmods-11

$JAVA_HOME/bin/jlink --module-path $PATH_TO_FX_MODS \
  --add-modules=java.se,javafx.web,javafx.fxml,javafx.swing \
  --output jre

вы создадите JRE, содержащую JavaFX.

Затем вы можете запустить свой проект, включая ваши зависимости в пути к классам:

jre/bin/java -cp \
  /Users/<user>/.gradle/caches/modules-2/files-2.1/com.teamdev.jxbrowser/jxbrowser/6.22/c9...6b/jxbrowser-6.22.jar:\
  /Users/<user>/.gradle/caches/modules-2/files-2.1/com.teamdev.jxbrowser/jxbrowser-mac/6.22/fa...d4/jxbrowser-mac-6.22.jar:\
  build/libs/browserApp.jar jxbrowser.BrowserApp 

Это также отлично работает, отображается браузер. Поэтому мы отбрасываем, что могут быть проблемы с JavaFX 11.

Теперь мы все еще можем сделать маленькую толстую банку с проектом и зависимостями jxBrowser. И затем, если вы запустите:

jre/bin/java -cp build/libs/browserApp.jar jxbrowser.BrowserApp

как вы понимаете, это не сработает, браузер не появится.

Итак, мой окончательный вывод заключается в том, что добавление толстой банки даже с двумя зависимостями jxBrowser не работает.

См., например, это пост о возможных причинах этого:

Файлы с одним и тем же путем могут присутствовать в нескольких JAR-файлах, и по умолчанию шейдерный плагин включает первый файл в толстый JAR-файл и отбрасывает остальные.

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

person José Pereda    schedule 20.11.2018