代码之家  ›  专栏  ›  技术社区  ›  Ivan Tamashevich

Quarkus 2.0 maven build未为AWS lambda创建uber jar

  •  0
  • Ivan Tamashevich  · 技术社区  · 5 年前

    我正在使用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 build时,我看到在做出决策时, 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。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Roman K    4 年前

    我还需要将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>