Introduction
Steps to bundle the native libraries to be pushed to Nexus, and to unpack the native libraries on mvn package
.
Bundling Native Libraries into a JAR File
Let’s assume we have the following native libraries for multiple platforms:-
➜ tree native native ├── linux │ ├── x86 │ │ └── libnative_synchronization.so │ └── x86_64 │ └── libnative_synchronization.so ├── macosx │ └── libnative_synchronization.jnilib └── win32 ├── x86 │ └── native_synchronization.dll └── x86_64 └── native_synchronization.dll
Create a jar that contains these native libraries. The -C
options prevents the native
folder from being created in the JAR file.
➜ jar cMf my-project-native.jar -C native .
Pushing JAR to Nexus
When pushing this native JAR file to Nexus, make sure to use the natives-*
classifier. In this example, I called it natives-all
.
<dependency> <groupId>my.project</groupId> <artifactId>native</artifactId> <version>1.0</version> <classifier>natives-all</classifier> </dependency>
Configuring pom.xml
First, add LWJGL and the native JAR dependencies.
<dependencies> <dependency> <groupId>org.lwjgl.lwjgl</groupId> <artifactId>lwjgl</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>my.project</groupId> <artifactId>native</artifactId> <version>1.0</version> <classifier>natives-all</classifier> </dependency> </dependencies>
Then, add the following plugin:-
<build> <plugins> <plugin> <groupId>com.googlecode.mavennatives</groupId> <artifactId>maven-nativedependencies-plugin</artifactId> <version>0.0.7</version> <executions> <execution> <id>unpacknatives</id> <phase>generate-resources</phase> <goals> <goal>copy</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
This plugin searches for dependencies with natives-*
classifier and unpacks the content to target/natives
folder.
Testing
Run mvn clean package
.
Inspect target/natives
. The native libraries should be unpacked here:-
target/natives ├── META-INF │ └── MANIFEST.MF ├── OpenAL32.dll ├── OpenAL64.dll ├── jinput-dx8.dll ├── jinput-dx8_64.dll ├── jinput-raw.dll ├── jinput-raw_64.dll ├── jinput-wintab.dll ├── libjinput-linux.so ├── libjinput-linux64.so ├── libjinput-osx.jnilib ├── liblwjgl.dylib ├── liblwjgl.so ├── liblwjgl64.so ├── libopenal.so ├── libopenal64.so ├── linux │ ├── x86 │ │ └── libnative_synchronization.so │ └── x86_64 │ └── libnative_synchronization.so ├── lwjgl.dll ├── lwjgl64.dll ├── macosx │ └── libnative_synchronization.jnilib ├── openal.dylib └── win32 ├── x86 │ └── native_synchronization.dll └── x86_64 └── native_synchronization.dll