Ikonli in Fat-Jar mit mehreren Icon-Packs einbinden

godi

Aktives Mitglied
Hallo,
ich habe eine JavaFX Application welche zwei Icon-Packs von Ikonli einbindet.
In IntelliJ lässt sich die Application ausführen, jedoch wenn ich mir mit IntelliJ eine Fat-Jar erstellen lasse und ausführe, dann gibt es eine Exception.
Caused by: java.lang.UnsupportedOperationException: Cannot resolve 'fab-accessible-icon'
at org.kordamp.ikonli.AbstractIkonResolver.resolve(AbstractIkonResolver.java:61)
at org.kordamp.ikonli.javafx.IkonResolver.resolve(IkonResolver.java:73)
at org.kordamp.ikonli.javafx.FontIcon.setIconLiteral(FontIcon.java:251)
... 33 more
Wenn ich nur ein Icon-Pack von Ikonli einbinde dann funktioniert die Fat-Jar auch. Also nehmen ich mal an, dass es am zweiten Icon-Pack liegt. Wenn ich in die Jar reinschaue dann sind auch beide Icon-Packs vorhanden.

An die Anleitung habe ich mich gehalten.
Mein Maven pom.xml sieht folgend aus:


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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>at.godi</groupId>
    <artifactId>TestIkonli</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>TestIkonli</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.kordamp.ikonli</groupId>
                <artifactId>ikonli-bom</artifactId>
                <version>12.3.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-javafx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-materialdesign2-pack</artifactId>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-fontawesome5-pack</artifactId>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>17.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>17.0.1</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    </transformers>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>at.godi.testikonli/at.godi.testikonli.RunHelloApplication</mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Im Anhang befindet sich ein Testprojekt welches mit IntelliJ erstellt wurde.

Hat jemand eine Idee an was es scheitern könnte?

godi
 

Anhänge

Also dein Testprojekt habe ich mal ausprobiert und ich bekomme da keinen Fehler. Bei mir läuft das ohne irgend einen Fehler auf meinem Windows 10 Rechner mit Java 17 (Temurin OpenJDK).

Wie baust du das Projekt? Probiere mal auf der Kommandozeile den Wrapper mit mvnw clean package.

Was ich gemacht habe:
  • ZIP Entpackt
  • In dem Verzeichnis ein mvnw clean package

Dann der Aufruf:
Code:
C:\Projects\temp\TestIkonli>java -cp target\TestIkonli-1.0-SNAPSHOT.jar at.godi.testikonli.RunHelloApplication
Aug. 30, 2022 8:57:50 AM com.sun.javafx.application.PlatformImpl startup
WARNUNG: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @574f137b'
Aug. 30, 2022 8:57:51 AM javafx.fxml.FXMLLoader$ValueElement processValue
WARNUNG: Loading FXML document with JavaFX API of version 18 by JavaFX runtime of version 17.0.1

C:\Projects\temp\TestIkonli>java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment Temurin-17.0.3+7 (build 17.0.3+7)
OpenJDK 64-Bit Server VM Temurin-17.0.3+7 (build 17.0.3+7, mixed mode, sharing)

C:\Projects\temp\TestIkonli>

1661842943469.png
 
Hallo,

Danke, habe es jetzt gemacht wie du gesagt hast und da funktioniert es wirklich.

Wusste nicht, dass mir "mvnw clean package" auch eine fat/uber jar erstellt.
Die jar habe ich mit IntelliJ Artifacts erstellt.

Aber gut, dass ich jetzt weiß wie die jar mit maven erstellt werden kann. Habe ich vor ein paar Wochen schon mal versucht und da nicht geschafft. Deshalb habe ich den temporären Weg über IntelliJ gemacht.
 
Hallo,

Danke, habe es jetzt gemacht wie du gesagt hast und da funktioniert es wirklich.

Wusste nicht, dass mir "mvnw clean package" auch eine fat/uber jar erstellt.
Die jar habe ich mit IntelliJ Artifacts erstellt.

Aber gut, dass ich jetzt weiß wie die jar mit maven erstellt werden kann. Habe ich vor ein paar Wochen schon mal versucht und da nicht geschafft. Deshalb habe ich den temporären Weg über IntelliJ gemacht.
Einfach einmal ein paar Erklärung, damit Du ein etwas besseres Bild der Problematik bekommst:

Bei dem Lifecycle in maven package wird das Ziel gebaut. Das ist dann erst einmal ein normales jar File.

Du hast aber das shade Plugin konfiguriert und hast gesagt, dass dies auch bei package laufen soll. (Dieses Execute phase package Element besagt dies). Das Shade Plugin baut dann das fat jar - und passt dabei die ganzen service Dateien an. Das original jar findest Du dann als original-....jar und das neue jar ist dann das fat jar.

Wenn Du das jar File mir IntelliJ gebaut hast, dann ist das Problem vermutlich einfach, dass die Services nicht richtig konfiguriert wurden. Das macht die Konfiguration, die da hinzu gefügt wurde mit dem ServicesResourceTransformer.

Lade einfach einmal dsa jar file von https://mvnrepository.com/artifact/org.kordamp.ikonli/ikonli-materialdesign-pack/12.3.1 herunter (oder Du findest es auch in deinem Home Verzeichnis unter .m2/repository/org/kordamp/ikonli/......... (Dann kopiere es woanders hin).

Benenne es einmal um in ein zip File, damit du hinein schauen kannst und entpacke es:
Schau dann einmal an: META-INF/services/
dort sind zwei Dateien - org.kordamp.ikonli.IkonHandler und org.kordamp.ikonli.Provider

Das sind Textdateien - die kannst Du Dir einmal ansehen. Den genauen Inhalt musst Du nicht verstehen - aber da stehen Klassen, die dazu dienen, dann die Icons zu laden / zu finden.

Die Schritte des herunter geladenen jar Files kannst Du nun wiederholen:
  • einmal mit dem fat JAR von Maven - da wirst Du dann sehen, dass diese Text Dateien sehr viel beinhalten. Halt der Inhalt aus allen Abhängigkeiten zusammen gefügt.
  • Dann das jar File von IntelliJ - da Du IntelliJ nicht gesagt hast, dass da etwas zu tun ist, wird hier entweder nichts sein oder einfach eine Datei einer Abhängigkeit (dann wurden die kopiert und mit jedem jar wurde die vorhandene überschrieben). Die Datei ist einfach zu klein.

Das einfach nur einmal als kleine Erläuterung um hier noch ein etwas tieferes Verständnis herbei zu führen.


Ach ja - in IntelliJ kannst Du das auch genau so bauen - öffne dazu einfach das Maven Toolfenster und im Lifecycle dann einfach package mit doppelclick starten (ggf. vorher erst noch das clean). Dann baut Maven - von IntelliJ aus gestartet - auch alles.
 

Zurück
Oben