繁体   English   中英

Google Cloud Function 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM