Google Cloud Function won't deploy with FAT jar

87 Views Asked by At

I have a Google cloud function (v2) that depends on and uses a private JAR called "base.jar". Base.jar contains a bunch of db classes for our app and is shared among several modules, including this cloud function, called "share.jar".

I'm following the instructions here for building and dpeloying a FAT jar.

https://cloud.google.com/functions/docs/concepts/java-deploy

After executing the mvn clean package and gcloud functions deploy ..., this error occurs:

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed with status: FAILURE and message: [ERROR] Failed to execute goal on project Share: Could not resolve dependencies for project com.app.share:Share:jar:0.1-SNAPSHOT: The following artifacts could not be resolved: com.app:Base:jar:1.0-SNAPSHOT (absent): Could not find artifact com.app:Base:jar:1.0-SNAPSHOT -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException. For more details see the logs at https://console.cloud.google.com/cloud-build/builds;region=us-central1/94b76cd9-4b53-4427-a23d-2d5975c6164d?project=361612196006.

Here is the pom.

<?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.app.share</groupId>
    <artifactId>Share</artifactId>
    <version>0.1-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Required for Function primitives -->
        <dependency>
            <groupId>com.google.cloud.functions</groupId>
            <artifactId>functions-framework-api</artifactId>
            <version>1.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.app</groupId>
            <artifactId>Base</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!--
                  Google Cloud Functions Framework Maven plugin

                  This plugin allows you to run Cloud Functions Java code
                  locally. Use the following terminal command to run a
                  given function locally:

                  mvn function:run -Drun.functionTarget=your.package.yourFunction
                -->
                <groupId>com.google.cloud.functions</groupId>
                <artifactId>function-maven-plugin</artifactId>
                <version>0.11.0</version>
                <configuration>
                    <functionTarget>com.app.share.Share</functionTarget>
                </configuration>
            </plugin>

            <!-- Incorporates external jars. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals><goal>shade</goal></goals>
                        <configuration>
                            <outputFile>${project.build.directory}/deployment/${build.finalName}.jar</outputFile>
                            <transformers>
                                <!-- This may be needed if you need to shade a signed JAR -->
                                <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                    <resource>.SF</resource>
                                    <resource>.DSA</resource>
                                    <resource>.RSA</resource>
                                </transformer>
                                <!-- This is needed if you have dependencies that use Service Loader. Most Google Cloud client libraries does. -->
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Note that this "share" project is a module of a parent pom, which includes a module for "Base" as well as "Share".

Parent

  • Base
  • Share

In any case, after clean/install I can see the target directory has a JAR without the included classes from Base. However, the deployment directory has a JAR that includes the classes from Base. So, I delete the first JAR and run google cloud deploy and still the error occurs.

UPDATE 1: Per Janez's comment, here is the pom with the parent proejct referenced. Similar problem occurs.

<?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>

    <parent>
        <groupId>com.app</groupId>
        <artifactId>Parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
 
    <groupId>com.app.share</groupId>
    <artifactId>Share</artifactId>
    <version>0.1-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Required for Function primitives -->
        <dependency>
            <groupId>com.google.cloud.functions</groupId>
            <artifactId>functions-framework-api</artifactId>
            <version>1.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.app</groupId>
            <artifactId>Base</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!--
                  Google Cloud Functions Framework Maven plugin

                  This plugin allows you to run Cloud Functions Java code
                  locally. Use the following terminal command to run a
                  given function locally:

                  mvn function:run -Drun.functionTarget=your.package.yourFunction
                -->
                <groupId>com.google.cloud.functions</groupId>
                <artifactId>function-maven-plugin</artifactId>
                <version>0.11.0</version>
                <configuration>
                    <functionTarget>com.app.share.Share</functionTarget>
                </configuration>
            </plugin>

            <!-- Incorporates external jars. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals><goal>shade</goal></goals>
                        <configuration>
                            <outputFile>${project.build.directory}/deployment/${build.finalName}.jar</outputFile>
                            <transformers>
                                <!-- This may be needed if you need to shade a signed JAR -->
                                <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                    <resource>.SF</resource>
                                    <resource>.DSA</resource>
                                    <resource>.RSA</resource>
                                </transformer>
                                <!-- This is needed if you have dependencies that use Service Loader. Most Google Cloud client libraries does. -->
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

And here is the output of "gcloud deploy function..."

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed with status: FAILURE and message: [ERROR] [ERROR] Some problems were encountered while processing the POMs: [FATAL] Non-resolvable parent POM for com.app.share:Share:0.1-SNAPSHOT: The following artifacts could not be resolved: com.app:Parent:pom:1.0-SNAPSHOT (absent): Could not find artifact com.app:Parent:pom:1.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13

THERE IS NO parent-1.0-SNAPSHOT.jar. Parent is the top level project pom!!!

1

There are 1 best solutions below

0
On

It seems that the problem was resolved by updating the gcloud CLI. I was on v458. Updating to the current verion v463, seems to have resolved the problem. I'll post here further if I notice problems.