嘗試在 Google 云上部署加密 java 云功能時遇到以下錯誤。[注意,功能在本地作業]。
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)
使用 nimbus-jose-jwt jar。也嘗試了多個版本的 jar。但是,面臨同樣的錯誤。以下是在 pom.xml 中添加的片段:
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.15.2</version>
</dependency>
Java 運行時:Java 11。添加如下功能代碼:
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) {
}
}
在部署之前還嘗試過“mvn clean package”。仍然面臨同樣的問題。
部署錯誤:

uj5u.com熱心網友回復:
您的錯誤表明您正在嘗試使用不存在的類。如果它在本地作業并且在 Google Cloud 上不起作用,則意味著庫/jar 配置不正確。
如果您正在部署的是 Fat/Uber jar,請解壓縮 jar 并驗證nimbus-jose-jwt.
uber JAR 是一個 JAR 檔案,其中包含函式類及其所有依賴項。您可以使用 Maven 和 Gradle 構建一個 uber JAR
如果您要部署的是 Thin Jar,請確保您的依賴項位于與部署的 JAR 相關的包中。
瘦 JAR 是一個 JAR 檔案,它只包含函式類,而沒有嵌入在同一個 JAR 檔案中的依賴項。由于部署仍然需要依賴項,因此您需要進行如下設定:
依賴項必須位于與要部署的 JAR 相關的子目錄中。JAR 必須有一個 META-INF/MANIFEST.MF 檔案,其中包含一個 Class-Path 屬性,其值列出了所需的依賴路徑。
Google Cloud 檔案非常清楚地說明了如何使用 Maven/Gradle 進行部署。
https://cloud.google.com/functions/docs/concepts/java-deploy#deploy_from_a_jar
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/431668.html
