Quarkus升级至3.0.3后无法生成Azure Function的Uber-Jar问题
Quarkus 3.0.3 Azure Functions 无法生成 Uber-Jar 的问题解决
问题原因
Quarkus 3.x 对 Azure Functions 的打包机制做了有意变更:quarkus-azure-functions-http 3.x 版本默认不再生成传统的 uber-jar,而是适配 Azure Functions 的部署规范,生成专用的目录结构部署包,这是已知的版本行为差异,并非 bug。
解决方案
方案一:使用官方推荐的 Azure Functions 打包流程
这是 Quarkus 3.x 针对 Azure Functions 的标准部署方式,无需手动生成 uber-jar:
- 在
pom.xml中配置quarkus-maven-plugin和azure-functions-maven-plugin:
<build> <plugins> <!-- Quarkus 构建插件 --> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>3.0.3.Final</version> <executions> <execution> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> <!-- Azure Functions 打包插件 --> <plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-functions-maven-plugin</artifactId> <version>1.23.0</version> <configuration> <appName>你的函数应用名称</appName> <resourceGroup>你的资源组名称</resourceGroup> <region>你的Azure区域</region> <runtime> <os>linux</os> <javaVersion>17</javaVersion> <!-- Quarkus 3.x 推荐使用 Java 17+ --> </runtime> </configuration> <executions> <execution> <id>package-functions</id> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 执行命令构建部署包:
mvn clean package
- 构建完成后,
target/azure-functions/你的函数应用名称目录下会生成符合 Azure 要求的完整部署包,直接部署即可。
方案二:强制生成 Uber-Jar(特殊场景)
如果因特殊部署需求必须生成 uber-jar,可通过以下步骤实现:
- 调整依赖:移除
quarkus-azure-functions-http,改用基础依赖组合:
<dependencies> <!-- Quarkus HTTP 核心依赖 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-vertx-http</artifactId> <version>3.0.3.Final</version> </dependency> <!-- Azure Functions Java 核心库 --> <dependency> <groupId>com.microsoft.azure.functions</groupId> <artifactId>azure-functions-java-library</artifactId> <version>3.0.0</version> </dependency> </dependencies>
- 配置
maven-shade-plugin构建 uber-jar:
<build> <packaging>jar</packaging> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 指定 Azure Functions 入口类 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.microsoft.azure.functions.worker.handler.FunctionApplication</mainClass> </transformer> <!-- 合并服务配置文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <!-- 签名文件过滤,避免打包冲突 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>
- 执行命令生成 uber-jar:
mvn clean package
生成的 uber-jar 位于 target/ 目录下,需手动配置 Azure Functions 的函数入口和触发规则。
注意事项
- Quarkus 3.x 基于 Jakarta EE 9+,需确保 Azure Functions Java 依赖版本(如
azure-functions-java-library)在 3.0.0 及以上,以兼容 Jakarta API。 - 方案二属于自定义打包方式,需自行维护 Azure Functions 与 Quarkus 的适配逻辑,官方优先推荐方案一。
内容的提问来源于stack exchange,提问作者user965220
相关产品推荐
相关产品推荐

