This might be dumb (please guide me), but I'm trying to include some binaries from a dependency in my package using Maven.
The dependency is jinput, and the binaries are "unpacked" during build. Since the binaries are unpacked after the build, they're not included in my .jar using the standard "resources"-way of including files. How can I make Maven include the binaries in my package when they aren't present during the build?
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>ProjectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>net.java.jinput</groupId>
<artifactId>jinput</artifactId>
<version>2.0.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Unpack the jinput binaries to "bin" -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>unpack jinput windows</id>
<phase>compile</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<skip>false</skip>
<artifactItems>
<artifactItem>
<groupId>net.java.jinput</groupId>
<artifactId>jinput-platform</artifactId>
<version>2.0.7</version>
<classifier>natives-windows</classifier>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>/bin</outputDirectory>
<includes>**/*.dll</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>${project.builddir}</directory>
<includes>
<include>bin/*.dll</include>
</includes>
</resource>
</resources>
</build>
</project>
Instead of resources, you can use maven-jar-plugin.
I've tested the below code and it works fine.
<properties>
<my.dll.folder>${project.build.directory}/unpackedfiles</my.dll.folder>
</properties>
<dependencies>
<dependency>
<groupId>net.java.jinput</groupId>
<artifactId>jinput</artifactId>
<version>2.0.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>net.java.jinput</groupId>
<artifactId>jinput-platform</artifactId>
<version>2.0.7</version>
<classifier>natives-windows</classifier>
<type>jar</type>
<overWrite>false</overWrite>
<outputDirectory>${my.dll.folder}/bin</outputDirectory>
<destFileName>optional-new-name.jar</destFileName>
<includes>**/*.dll</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${my.dll.folder}</classesDirectory>
<classifier>sample</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Once your pom file is modified with above code, you can execute below command
mvn clean package
Then you can verify that the resulting jar file contains the required *.dll files in bin folder.
You can remove the <classifier>
tag if you want to overwrite the same output jar file.