问题描述
是否有一种使用JAVA将第三方jar添加到Azure函数的方法.我需要在运行时将json-simple jar和jackson-databind jars用于该功能.现在,我的代码抛出一个运行时异常(ClassNotFound Exception),因为该函数在运行时无法引用该jar,因为它不可用.
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 run time. Right now, My code throws a runtime exception(ClassNotFound Exception) as the function is not able to reference the jar during runtime because it is unavailable.
我尝试使用maven-shade-plugin.它确实创建了一个包含外部jar的可执行jar,但是部署仍采用原始jar.
I tried using maven-shade-plugin. It does create an executable jar including the external jars but the deployment still takes the original jar.
请提出建议.
谢谢.
POM.xml
<?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.sce.api.learning</groupId>
<artifactId>myApi</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Azure Java Functions</name>
<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>
<functionAppName>mckapi-http-nov2</functionAppName>
</properties>
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-java-core</artifactId>
<version>1.0.0-beta-1</version>
</dependency>
<!-- Adding GSON dependancy -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20171018</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-maven-plugin</artifactId>
<version>0.1.4</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-maven-plugin</artifactId>
<configuration>
<resourceGroup>java-functions-group</resourceGroup>
<appName>${functionAppName}</appName>
<region>westus2</region>
<appSettings>
<property>
<name>FUNCTIONS_EXTENSION_VERSION</name>
<value>beta</value>
</property>
</appSettings>
</configuration>
<executions>
<execution>
<id>package-functions</id>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${project.build.directory}/azure-functions/${functionAppName}
</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}</directory>
<includes>
<include>host.json</include>
<include>local.settings.json</include>
**<include>**/*.jar</include>**<!-- This includes the jar files in the target/lib folder -->
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${project.build.directory}/azure-functions/${functionAppName}
</outputDirectory>
<shadedArtifactAttached>false</shadedArtifactAttached>
</configuration>
</execution>
</executions>
<configuration>
<finalName>${artifactId}-${version}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
推荐答案
我遇到了同样的问题,并且发现了如何安排解决方案.
I had the same problem and I figured out how to arrange a solution.
首先,按照此链接.
假定<project_root_path>
作为创建项目的文件夹.
Assume <project_root_path>
as the folder where you will create the project.
生成maven项目后,只需将 maven-assembly-plugin 插件添加到<project_root_path>/pom.xml
中的<project_root_path>/pom.xml
中:
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>
使用命令mvn clean compile package
编译和打包Azure函数将在路径<project_root_path>/target/<project_name>.jar
上生成一个jar,其中包含pom.xml <dependencies></dependencies>
下列出的所有外部库.
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.
注释1 :如果不修改标准pom.xml,将根据<artifactId>_<version>.jar
生成<project_name>
.
Note 1: if you didn't modify the standard pom.xml, <project_name>
will be generated according to <artifactId>_<version>.jar
.
注释2 :如果您未在上述代码段中使用<appendAssemblyId>false</appendAssemblyId>
指令,则<project_name>
将为<artifactId>_<version>-<descriptorRef>.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.
因此,现在您应该拥有完整的<project_root_path>/target/<project_name>.jar
,但是在使用它之前,必须将其复制到<project_root_path>/target/azure-functions/<azure_function_name>/
下,其中<azure_function_name>
是在.
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.
现在您可以使用Azure Maven插件对其进行测试:
Now you can test it using the Azure Maven plugins:
- 在本地计算机上运行Azure功能:
mvn azure-functions:run
- 在订阅上部署Azure功能:
mvn azure-functions:deploy
- Running the Azure Function on your machine locally:
mvn azure-functions:run
- Deploying the Azure Function on your subscription:
mvn azure-functions:deploy
最后,关键是将使用maven-assembly-plugin生成的jar移到正确的位置,在运行/部署过程中,Azure Maven插件将在其中显示.我希望我可以使用标准的Maven命令找到一种更自动的方式.
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.
希望这会有所帮助.
CIP
编辑(17/11/17)
在<configuration>
POM标记内添加<outputDirectory>${project.build.directory}/azure-functions/${functionAppName}</outputDirectory>
并将<goal>
标记更改为程序集,这使Maven自动在Azure Function登台目录中复制最终的JAR.这允许mvn azure-functions:run
和mvn azure-functions:deploy
命令直接使用包含所有依赖项的正确JAR文件.不再需要手动操作.
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.
上述POM已相应更新.
The above POM have been updated accordingly.
修改(17/11/17)
如果要使用Maven阴影插件而不是Maven组件插件,请使用以下代码替换上面的XML代码段:
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>
它可以使用前面提到的相同的标准Maven命令来工作.
It will work using the same standard Maven commands mentioned before.
这篇关于如何在Java Azure函数中添加依赖项JAR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!