I had the same problem and I figured out how to arrange a solution.
First of all, start from a brand new Maven project following the straightforward guide at this link.
Assume <project_root_path>
as the folder where you will create the project.
Once you have generated your maven project, just add this maven-assembly-plugin plugin on your <project_root_path>/pom.xml
within <build><plugins>...</plugins></build>
:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<outputDirectory>${project.build.directory}/azure-functions/${functionAppName}</outputDirectory>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive />
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
Compiling and packaging the Azure Function with command mvn clean compile package
will produce a jar on path <project_root_path>/target/<project_name>.jar
containing all the external libraries listed under the <dependencies></dependencies>
of the pom.xml.
Note 1: if you didn't modify the standard pom.xml, <project_name>
will be generated according to <artifactId>_<version>.jar
.
Note 2: if you don't use the <appendAssemblyId>false</appendAssemblyId>
directive on the above snippet, the <project_name>
will be <artifactId>_<version>-<descriptorRef>.jar
. Consider this for the following instructions.
So, now you should have your complete <project_root_path>/target/<project_name>.jar
, but before using it you have to copy it under <project_root_path>/target/azure-functions/<azure_function_name>/
where <azure_function_name>
is the name you gave to your function during the creation progress documented on the above link.
Now you can test it using the Azure Maven plugins:
- Running the Azure Function on your machine locally:
mvn azure-functions:run
- Deploying the Azure Function on your subscription:
mvn azure-functions:deploy
At the end, the key point is moving the jar generated with maven-assembly-plugin into the right place where the Azure Maven plugin will look during the run/deploy process. I wish I could find a more automatic way using standard Maven commands.
Hope this helps.
Ciao
IP
Edit (17/11/17)
Adding <outputDirectory>${project.build.directory}/azure-functions/${functionAppName}</outputDirectory>
within the <configuration>
POM tag and changing <goal>
tag to assembly, it makes Maven to automatically copy the final JAR in the Azure Function staging directory. This allows the mvn azure-functions:run
and mvn azure-functions:deploy
commands to directly use the correct JAR file containing all dependency. No manual actions are requested anymore.
The above POM have been updated accordingly.
Edit (21/11/17)
In case you want to use the Maven Shade Plugin instead of the Maven Assembly Plugin, replace the above XML snippet with this one:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<shadedArtifactAttached>false</shadedArtifactAttached>
<outputFile>${project.build.directory}/azure-functions/${functionAppName}/${project.artifactId}-${project.version}.jar</outputFile>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
It will work using the same standard Maven commands mentioned before.