LWJGL Natives in Maven einbinden
2019-05-31 13:00:00
Seit kurzem verwende ich Maven für meine Projekte und so manches ist noch neu für mich. Eines dieser Projekte basiert auf LWJGL. Dabei handelt es sich um eine Library für Java mit diversen Bindings für alle gängigen Plattformen. Enthalten sind unter anderem Opengl, Vulcan, OpenAL usw.
Um LWJGL verwenden zu können bindet man je nach benötigter Funktionalität die entsprechenden Dependencies in die pom.xml ein. Zum Beispiel lwjgl-opengl.jar für OpenGL. Daneben wird auch immer die lwjgl.jar benötigt. Da LWJGL mehrere Plattformen unterstützt, muss für das jeweilige Betriebssystem noch eine Natives-JAR eingebunden werden. Diese heißen lwjgl-windows.jar, lwjgl-linux.jar oder lwjgl-macos.jar.
Mein erster Versuch sah wie folgt aus:
<dependencies> <!-- More dependencies --> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl</artifactId> <version>3.1.0</version> </dependency> <!-- More dependencies --></dependencies>
Die lwjgl.jar wird wie erwartet eingebunden. Das Projekt konnte jedoch nicht ausgeführt werden, weil die Natives nicht eingebunden wurde. Die Natives liegen im selben Verzeichnis wie die lwjgl.jar. Um die entsprechende Nativ-JAR einzubinden, kann man in der Dependency einen classifier angeben, wie im folgenden Beispiel gezeigt.
<dependencies> <!-- More dependencies --> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl</artifactId> <classifier>natives-windows</classifier> <version>3.1.0</version> </dependency> <!-- More dependencies --></dependencies>
Das Projekt war nun lauffähig. Jedoch nur auf Windows. Besser ist es, wenn je nach Plattform eine andere JAR eingebunden wird. Dafür lassen sich in der pom.xml Profile erstellen. In diesen können dann properties definiert werden. Deren Inhalt läst sich an verschiedenen Stellen im pom.xml einfügen.
Im folgendem Beispiel wird die Plattform mittels eines Profils gesetzt.
<profiles> <profile> <activation> <os> <family>windows</family> </os> </activation> <properties> <plattform>windows</plattform> </properties> </profile></profiles><dependencies> <!-- More dependencies --> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl</artifactId> <classifier>natives-${plattform}</classifier> <version>3.1.0</version> </dependency> <!-- More dependencies --></dependencies>
Das oben angelegte Profil wird aktiv,wenn das Betriebssystem zur Familie Windows gehört. Damit steht dann das property plattform bereit, dessen Inhalt dann in der dependency mit dem Platzhalter ${plattform} eingebunden wird. Was jetzt noch fehlt, sind Profile für die anderen Plattformen. Aber ich denke das Prinzip sollte klar sein und ich hoffe ich konnte dem einen oder anderen helfen.