How to add dependency JAR in java azure functions

后端 未结 2 2051
Happy的楠姐
Happy的楠姐 2020-12-20 17:52

Is there a way to add third party jars to Azure functions using JAVA. I would need to have the json-simple jar and jackson-databind jars to be available for the function at

相关标签:
2条回答
  • 2020-12-20 18:21

    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:

    1. Running the Azure Function on your machine locally: mvn azure-functions:run
    2. 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.

    0 讨论(0)
  • 2020-12-20 18:24

    The latest version of pom.xml generated by the azure-functions-archetype that you use to prepare the Azure Function project (see this link for more details) seems to already include the plugin to copy dependencies.

    My pom.xml includes the following plugin by default, and it seems to copy the dependencies that I have specified into the ${stagingDirectory}/lib automatically.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${stagingDirectory}/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                    <includeScope>runtime</includeScope>
                    <excludeArtifactIds>azure-functions-java-library</excludeArtifactIds>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
    0 讨论(0)
提交回复
热议问题