'Error deploying Encryption Java cloud function on Google cloud

Facing the below error while trying to deploy an encryption java cloud function on Google cloud. [Note, function works locally].

Exception in thread "main" java.lang.NoClassDefFoundError: com/nimbusds/jose/JWEEncrypter at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137) at java.base/java.lang.Class.getConstructor0(Class.java:3342) at java.base/java.lang.Class.getConstructor(Class.java:2151) at com.google.cloud.functions.invoker.HttpFunctionExecutor.forClass(HttpFunctionExecutor.java:53) at com.google.cloud.functions.invoker.runner.Invoker.startServer(Invoker.java:243) at com.google.cloud.functions.invoker.runner.Invoker.main(Invoker.java:121) Caused by: java.lang.ClassNotFoundException: com.nimbusds.jose.JWEEncrypter at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 7 more
Exception in thread "main" java.lang.NoClassDefFoundError: com/nimbusds/jose/JWEEncrypter at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137) at java.base/java.lang.Class.getConstructor0(Class.java:3342) at java.base/java.lang.Class.getConstructor(Class.java:2151) at com.google.cloud.functions.invoker.HttpFunctionExecutor.forClass(HttpFunctionExecutor.java:53) at com.google.cloud.functions.invoker.runner.Invoker.startServer(Invoker.java:243) at com.google.cloud.functions.invoker.runner.Invoker.main(Invoker.java:121) Caused by: java.lang.ClassNotFoundException: com.nimbusds.jose.JWEEncrypter at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) 

Using the nimbus-jose-jwt jar. Tried with multiple versions of the jar as well. However, facing the same error. Below is snippet of it added in pom.xml:

    <dependency>
            <groupId>com.nimbusds</groupId>
            <artifactId>nimbus-jose-jwt</artifactId>
            <version>9.15.2</version>
    </dependency>

Java Runtime : Java 11 . Adding the function code below:

import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.http.HttpStatus;
import java.security.interfaces.*;
import javax.crypto.*;
import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.*;
import com.nimbusds.jwt.*;
import java.util.*;
import java.security.KeyFactory;
import java.security.spec.X509EncodedKeySpec;
import java.io.File;
import java.security.PublicKey;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.DataInputStream;
public class Encrypt implements HttpFunction {

  private static final Gson gson = new Gson();
  private static final Logger logger = Logger.getLogger(
      Encrypt.class.getName());

  public void service(HttpRequest request, HttpResponse response)
      throws IOException {
    PrintWriter writer = new PrintWriter(response.getWriter());

    String contentType = request.getContentType().orElse("");
    String plaintext, ciphertext = "";
    String jwtString="";
    try {
      JsonObject body = gson.fromJson(request.getReader(), JsonObject.class);
      plaintext = body.toString();
      logger.log(Level.INFO, "Plaintext: " + plaintext);
      RSAPublicKey publicKey = getPublicKey();
      Date now = new Date();
      // convert json object to map
      Map<String, Object> claims = gson.fromJson(plaintext, HashMap.class);
      System.out.println("claims: "+claims);
  
      JWTClaimsSet jwtClaims;
      jwtClaims=generate(claims);
      
      System.out.println("jwtClaims: " + jwtClaims);
   
      System.out.println(jwtClaims.toJSONObject());
  
      JWEHeader header = new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM)
          .type(JOSEObjectType.JWT).build();

      EncryptedJWT jwt = new EncryptedJWT(header, jwtClaims);

      RSAEncrypter encrypter = new RSAEncrypter(((RSAPublicKey)(publicKey)));

      jwt.encrypt(encrypter);

       jwtString = jwt.serialize();

      System.out.println(jwtString);

      jwt = EncryptedJWT.parse(jwtString);

      response.setStatusCode(HttpURLConnection.HTTP_OK);
    } catch (Exception e) {
      logger.severe("Error parsing JSON: " + e.getMessage());
    }
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("payload", jwtString);
    String mapAsString = map
        .keySet()
        .stream()
        .map(key -> "\"" + key + "\":\"" + map.get(key) + "\"")
        .collect(Collectors.joining(", ", "{", "}"));
    logger.log(Level.INFO, "mapAsString: " + mapAsString);
    writer.printf(mapAsString);
  }


  public static RSAPublicKey getPublicKey() {
    try {

      String publicKeyString = "aaa";
      publicKeyString = publicKeyString.trim();
      // byte[] publicKeyBytes=publicKeyString.getBytes();
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");

      byte[] decoded = Base64.getDecoder().decode(publicKeyString);
      X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(decoded);
      RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);
      return publicKey;
    } catch (Exception e) {

      e.printStackTrace();
      return null;
    }
  }

  public JWTClaimsSet generate(final Map<String, Object> claims) {
    // claims builder
    final JWTClaimsSet.Builder builder = new JWTClaimsSet.Builder();
    // add claims
    for (final Map.Entry<String, Object> entry : claims.entrySet()) {
      builder.claim(entry.getKey(), entry.getValue());
    }

    return builder.build();
  }

  public static void main(String[] args) {
  }

}

Have also tried "mvn clean package" before deploying. Still face the same issue.

deployment error: deployment-error



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source