it-swarm.dev

Uruchamianie próbki javafx na JDK 11 z OpenJFX 11 JMODS na ścieżce modułu

Pobrałem pliki JavaFX Jmod z projektu OpenJFX i umieściłem je w katalogu G:\openjfx\javafx-jmods-11. Używam OpenJDK 11, który nie ma JavaFX jmod w Java_HOME/jmods, tzn. Nie ma dystrybucji JavaFX. 

Plik informacji o module:

module gui{
    requires javafx.graphics;
    requires javafx.controls;

    exports com.test;
}

Kompiluję z następującymi: 

javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src 
    src\gui\com\test\*.Java src\gui\module-info.Java

Kompilacja się powiedzie. Ale nie mogę uruchomić skompilowanego kodu za pomocą poniższego polecenia:

Java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo

Ale mam następujący błąd:

Error occurred during initialization of boot layer
Java.lang.module.FindException: Module javafx.graphics not found, required by gui
7
MohamedSanaulla

Sądzę, że istnieje wyjaśnienie błędu, przed którym stoisz: jmods nie może być użyty w czasie wykonywania.

Zostało to wyjaśnione tutaj: http://openjdk.Java.net/jeps/261#Packaging:-JMOD-files :

Pliki JMOD mogą być używane w czasie kompilacji i czasie połączenia, ale nie w czasie wykonywania. Aby wesprzeć je w czasie wykonywania, na ogół musimy być przygotowani na wyodrębnianie i łączenie bibliotek kodu natywnego w locie.

i kredyt idzie do tej odpowiedzi .

Zrobiłem więc prosty moduł hellofx:

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

z próbką HelloFX z tutaj i pobrał jmods dla JavaFX 11 dla mojej platformy z tutaj . Pobrałem także JavaFX 11 SDK (słoiki) z tej samej lokalizacji.

Czas kompilacji

W czasie kompilacji możemy to zrobić za pomocą jmods:

javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.Java")

lub z SDK:

javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.Java")    

W obu przypadkach wynik jest dokładnie taki sam, jak oczekiwano: biblioteki macierzyste nie są wymagane podczas kompilacji. 

Czas wykonania

Teraz chcemy uruchomić nasz mały moduł.

Z jmods, jak podaje OP, działa:

Java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX   

kończy się niepowodzeniem:

Error occurred during initialization of boot layer
  Java.lang.module.FindException: Module javafx.controls not found, required by hellofx

Ale używając SDK działa:

Java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX

Czas łącza

Jak stwierdzono w JEP-261, jmods działają równie dobrze w czasie łącza, więc możemy użyć narzędzia jlink pomiędzy czasem kompilacji i czasem wykonywania.

Możesz użyć narzędzia jlink do złożenia i optymalizacji zestawu modułów i ich zależności w niestandardowym obrazie środowiska wykonawczego. ( źródło )

Zróbmy więc:

jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links

wygeneruje folder o pojemności 90,7 MB (na moim Macu). Zauważ, że folder lib zawiera wszystkie wymagane biblioteki rodzime z Java 11 iz JavaFX 11, a także plik o rozmiarze 70,5 MB o nazwie modules.

Run time (2)

I wreszcie możemy:

links/bin/Java -m hellofx/hellofx.HelloFX

I to zadziała.

Podsumowując, jeśli chcemy używać tylko jmods do kompilowania i uruchamiania naszych modułów, musimy dać dodatkowy krok z jlink. W przeciwnym razie dla środowiska wykonawczego będziemy potrzebować JavaFX SDK.

11
José Pereda

Jeśli nie zostanie automatycznie dodany, spróbuj użyć tej konfiguracji w pliku pom.xml. Pamiętaj, aby zmienić „!! TWOJA GŁÓWNA NAZWA KLASY TUTAJ !!” u dołu kodu do nazwy klasy za pomocą głównej metody! Jeśli moja klasa to Example.Java, będę chciał tam umieścić tylko przykład.

 <dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11.0.2</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.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>Java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>!!YOUR MAIN CLASSNAME HERE!!</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

JavaFX nie jest automatycznie dodawany jako zależność od Java 11. Dlatego musimy dodać ręcznie.

0
Searjasub