【问题标题】:Quarkus 2.0 maven build is not creating uber-jar for AWS lambdaQuarkus 2.0 maven build 没有为 AWS lambda 创建 uber-jar
【发布时间】:2021-10-02 07:11:32
【问题描述】:

我正在使用 Quarkus 2.0 构建 uber-jar 以用作 AWS lambda。 Maven构建脚本如下:

    <properties>
        <quarkus.package.type>uber-jar</quarkus.package.type>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-amazon-lambda</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugin>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>2.0.3.Final</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

application.properties 还包含quarkus.package.type=uber-jar 配置。

当我调试 Maven 构建时,我看到在做出决定的那一刻,quarkus-maven-plugin 执行 the code:

@BuildStep
    public JarBuildItem buildRunnerJar(CurateOutcomeBuildItem curateOutcomeBuildItem, OutputTargetBuildItem outputTargetBuildItem, TransformedClassesBuildItem transformedClasses, ApplicationArchivesBuildItem applicationArchivesBuildItem, ApplicationInfoBuildItem applicationInfo, PackageConfig packageConfig, ClassLoadingConfig classLoadingConfig, List<GeneratedClassBuildItem> generatedClasses, List<GeneratedResourceBuildItem> generatedResources, List<UberJarRequiredBuildItem> uberJarRequired, List<UberJarMergedResourceBuildItem> uberJarMergedResourceBuildItems, List<UberJarIgnoredResourceBuildItem> uberJarIgnoredResourceBuildItems, List<LegacyJarRequiredBuildItem> legacyJarRequired, QuarkusBuildCloseablesBuildItem closeablesBuildItem, List<AdditionalApplicationArchiveBuildItem> additionalApplicationArchiveBuildItems, MainClassBuildItem mainClassBuildItem, Optional<AppCDSRequestedBuildItem> appCDS) throws Exception {
        if (appCDS.isPresent()) {
            this.handleAppCDSSupportFileGeneration(transformedClasses, generatedClasses, (AppCDSRequestedBuildItem)appCDS.get());
        }

        if (!uberJarRequired.isEmpty() && !legacyJarRequired.isEmpty()) {
            throw new RuntimeException("Extensions with conflicting package types. One extension requires uber-jar another requires legacy format");
        } else if (legacyJarRequired.isEmpty() && (!uberJarRequired.isEmpty() || packageConfig.type.equalsIgnoreCase("uber-jar"))) {
            /* I want it get there, but it doesn't due to "legacyJarRequired" containing an item, ("packageConfig == uber-jar" as expected) */          

            return this.buildUberJar(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, applicationArchivesBuildItem, packageConfig, applicationInfo, generatedClasses, generatedResources, uberJarMergedResourceBuildItems, uberJarIgnoredResourceBuildItems, mainClassBuildItem);
        } else {
            /* execution gets there because "legacyJarRequired" contains an item */
 
            return legacyJarRequired.isEmpty() && !packageConfig.isLegacyJar() && !packageConfig.type.equalsIgnoreCase("legacy") ? this.buildThinJar(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, applicationArchivesBuildItem, packageConfig, classLoadingConfig, applicationInfo, generatedClasses, generatedResources, additionalApplicationArchiveBuildItems, mainClassBuildItem) : this.buildLegacyThinJar(curateOutcomeBuildItem, outputTargetBuildItem, transformedClasses, applicationArchivesBuildItem, packageConfig, applicationInfo, generatedClasses, generatedResources, mainClassBuildItem);
        }
    }

并且legacyJarRequired中的项目被添加到here中

    @BuildStep(onlyIf = IsNormal.class, onlyIfNot = NativeBuild.class)
    public void requireLegacy(BuildProducer<LegacyJarRequiredBuildItem> required) {
        required.produce(new LegacyJarRequiredBuildItem());
    }

如何避免将此元素添加到构建配置中以从我的应用构建中接收版本化的xxx-yyy-zzz-runner.jar?

function.zip 构建得很好,但这不是我的选择,因为我想将构建结果推送到 maven repo。

【问题讨论】:

    标签: java maven aws-lambda build quarkus


    【解决方案1】:

    我还需要将一个 uber-jar 部署到 artifactory,以便进一步部署为 AWS lambda。最后我用build-helper-maven-plugin:attach-artifact 插件解决了这个问题。它将function.zip 附加到 Nexus 中的工件,因此 Jenkins 能够获取存档并将其部署到 AWS。

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <id>attach-artifacts</id>
                <phase>package</phase>
                <goals>
                    <goal>attach-artifact</goal>
                </goals>
                <configuration>
                    <artifacts>
                        <artifact>
                            <file>./target/function.zip</file>
                            <type>zip</type>
                        </artifact>
                    </artifacts>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2022-01-26
      相关资源
      最近更新 更多