![](/img/trans.png)
[英]Java Lambda for spring-cloud version to 3.2.3/3.1.7 org/springframework/boot/ApplicationContextFactory: java.lang.NoClassDefFoundError
[英]Google Cloud Function java.lang.NoClassDefFoundError while following example code
我尝试使用存储触发器测试 gcloud function。 gcloud function 应该调用公共的 gcloud 服务,但需要身份验证。 我可以毫无问题地在本地执行 function。 但是在 gcloud 上,我可以在 function 日志中找到 NoClassDefFoundError。
Failed to execute functions.HelloGcs java.lang.NoClassDefFoundError: io/opencensus/trace/propagation/TextFormat$Setter at com.google.api.client.http.HttpRequest.(HttpRequest.java:203) at com.google.api. client.http.HttpTransport.buildRequest(HttpTransport.java:115) at com.google.api.client.http.HttpRequestFactory.buildRequest(HttpRequestFactory.java:86) at com.google.api.client.http.HttpRequestFactory.buildGetRequest( HttpRequestFactory.java:117) at com.google.auth.oauth2.ComputeEngineCredentials.runningOnComputeEngine(ComputeEngineCredentials.java:285) at com.google.auth.oauth2.DefaultCredentialsProvider.tryGetComputeCredentials(DefaultCredentialsProvider.java:314) at com.google.auth .oauth2.DefaultCredentialsProvider.getDefaultCredentialsUnsynchronized(默认 CredentialsProvider.java:223) at com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentials(DefaultCredentialsProvider.java:126) at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:124) at com.google.auth 。 21) at com.google.cloud.functions.invoker.BackgroundFunctionExecutor$TypedFunctionExecutor.serviceLegacyEvent(BackgroundFunctionExecutor.java:285) at com.google.cloud.functions.invoker.BackgroundFunctionExecutor.lambda$serviceLegacyEvent$8(BackgroundFunctionExecutor.java:375) at com.google.cloud.functions.invoker.BackgroundFunctionExecutor.runWithContextClassLoader(Ba ckgroundFunctionExecutor.java:382) at com.google.cloud.functions.invoker.BackgroundFunctionExecutor.serviceLegacyEvent(BackgroundFunctionExecutor.java:375) at com.google.cloud.functions.invoker.BackgroundFunctionExecutor.service(BackgroundFunctionExecutor.java:330) at javax .servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java :547) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297) at org.eclipse. jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) 在 org.88317 647788788.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) 在 org.864t.jety.87831 ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 在 com.google.cloud.functions.Invoker.Invoker. Invoker.java:392) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:500) at org.eclipse .jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) at org.eclipse.jetty.server.HttpChannel.handle( HttpChannel.java:375) 在 org.eclipse.jetty.server.HttpConnection.o nFillable(HttpConnection.java:270) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) at org .eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) at org.eclipse.jetty.util. thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)在org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)在org.88317647.jetstratety.thread.thread.thread EatWhatYouKill.run(EatWhatYouKill.java:129) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool. java:806) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java .lang.ClassNotFoundException: io.opencensus.trace.propagation.TextFormat$Setter 在 java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) 在 java.baseLoader.ClassLoader.ClassLoader.lang java:589) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)... 47 更多
设置:
如您所见,我使用此处的云触发器 java 示例代码: https://cloud.google.com/functions/docs/calling/storage?hl=de#functions-calling-storage-java
我从这里将代码扩展了 static function: https://cloud.google.com/run/docs/authenticating/service-to-service#acquire-token
最终demo class的代码:
package functions;
import com.google.cloud.functions.BackgroundFunction;
import com.google.cloud.functions.Context;
import functions.eventpojos.GcsEvent;
import java.io.IOException;
import java.util.logging.Logger;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.IdTokenCredentials;
import com.google.auth.oauth2.IdTokenProvider;
public class HelloGcs implements BackgroundFunction<GcsEvent> {
private static final Logger logger = Logger.getLogger(HelloGcs.class.getName());
private static final String PATH = "https://demo/api/smoke";
@Override
public void accept(GcsEvent event, Context context) {
logger.info("Event: " + context.eventId());
logger.info("Event Type: " + context.eventType());
logger.info("Bucket: " + event.getBucket());
logger.info("File: " + event.getName());
logger.info("Metageneration: " + event.getMetageneration());
logger.info("Created: " + event.getTimeCreated());
logger.info("Updated: " + event.getUpdated());
logger.info("Call: " + PATH);
try {
makeGetRequest(PATH);
} catch (IOException e) {
e.printStackTrace();
}
}
public static HttpResponse makeGetRequest(String serviceUrl) throws IOException {
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
if (!(credentials instanceof IdTokenProvider)) {
throw new IllegalArgumentException("Credentials are not an instance of IdTokenProvider.");
}
IdTokenCredentials tokenCredential =
IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience(serviceUrl)
.build();
GenericUrl genericUrl = new GenericUrl(serviceUrl);
HttpCredentialsAdapter adapter = new HttpCredentialsAdapter(tokenCredential);
HttpTransport transport = new NetHttpTransport();
HttpRequest request = transport.createRequestFactory(adapter).buildGetRequest(genericUrl);
return request.execute();
}
}
示例代码已上传
gcloud 函数部署 java-gcs-function
--入口函数.HelloGcs
--运行时java11
--内存 512MB
--trigger-resource YOUR_TRIGGER_BUCKET_NAME
--触发事件 google.storage.object.finalize
function 的所有者是一个附加服务帐户(如此处https://cloud.google.com/run/docs/authenticating/service-to-service章节“设置服务帐户”所述)
提前致谢,我们将不胜感激。
异常是说您依赖的外部库在程序的类路径中不可用。
解决该问题的最简单方法是将您的代码作为胖 jar提交,以便所有依赖项在运行时可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.