当前位置: 首页 > 知识库问答 >
问题:

Google Cloud Functionjava.lang.NoClassDefFoundError,同时遵循示例代码

公孙芷阳
2023-03-14

我尝试使用存储触发器测试gcloud函数。gcloud函数应该调用一个公共的gcloud服务,但需要身份验证。我可以在本地执行该函数而没有任何问题。但是在gcloud上,我可以在函数日志中找到一个NoClassDefFoundError。

无法执行函数。HelloGcs java。lang.NoClassDefFoundError:io/opencensus/trace/propagation/TextFormat$Setter在com上。谷歌。应用程序编程接口。客户http。HttpRequest。(HttpRequest.java:203)在com上。谷歌。应用程序编程接口。客户http。HttpTransport。buildRequest(HttpTransport.java:115)位于com.google.应用程序编程接口。客户http。HttpRequestFactory。buildRequest(HttpRequestFactory.java:86)位于com.google.应用程序编程接口。客户http。HttpRequestFactory。buildGetRequest(HttpRequestFactory.java:117)位于com.google.啊。oauth2。强制性的。运行com上的计算机引擎(computenginecredentials.java:285)。谷歌。啊。oauth2。DefaultCredentialsProvider。tryGetComputeCredentials(DefaultCredentialsProvider.java:314)位于com.google.啊。oauth2。DefaultCredentialsProvider。getDefaultCredentialsUnsynchronized(DefaultCredentialsProvider.java:223)位于com.google.啊。oauth2。DefaultCredentialsProvider。getDefaultCredentials(DefaultCredentialsProvider.java:126)位于com.google.啊。oauth2。谷歌。getApplicationDefault(GoogleCredentials.java:124)位于com.google.啊。oauth2。谷歌。函数处的getApplicationDefault(GoogleCredentials.java:96)。你好。函数中的makeGetRequest(HelloGcs.java:44)。你好。在函数处接受(HelloGcs.java:37)。你好。在com上接受(HelloGcs.java:21)。谷歌。云功能。召唤者。BackgroundFunctionExecutor$TypedFunctionExecutor。serviceLegacyEvent(BackgroundFunctionExecutor.java:285)位于com.google.云功能。召唤者。背景功能执行器。lambda$serviceLegacyEvent$8(BackgroundFunctionExecutor.java:375)位于com.google.云功能。召唤者。背景功能执行器。在com上运行WithContextClassLoader(BackgroundFunctionExecutor.java:382)。谷歌。云功能。召唤者。背景功能执行器。com上的serviceLegacyEvent(BackgroundFunctionExecutor.java:375)。谷歌。云功能。召唤者。背景功能执行器。javax上的服务(BackgroundFunctionExecutor.java:330)。servlet。http。HttpServlet。服务(HttpServlet.java:790)位于org。日食码头。servlet。ServletHolder。handle(ServletHolder.java:755)位于org。日食码头。servlet。ServletHandler。doHandle(ServletHandler.java:547)位于org。日食码头。服务器汉德勒。ScopedHandler。nextHandle(ScopedHandler.java:233)位于org。日食码头。服务器汉德勒。ContextHandler。doHandle(ContextHandler.java:1297)位于org。日食码头。服务器汉德勒。ScopedHandler。nextScope(ScopedHandler.java:188)位于org。日食码头。servlet。ServletHandler。doScope(ServletHandler.java:485)位于org。日食码头。服务器汉德勒。ScopedHandler。nextScope(ScopedHandler.java:186)位于org。日食码头。服务器汉德勒。ContextHandler。doScope(ContextHandler.java:1212)位于org。日食码头。服务器汉德勒。ScopedHandler。在org上处理(ScopedHandler.java:141)。日食码头。服务器汉德勒。手袋。handle(HandlerWrapper.java:127)位于com.google.云功能。召唤者。跑步者调用程序$NotFoundHandler。在org上处理(Invoker.java:392)。日食码头。服务器汉德勒。手袋。handle(HandlerWrapper.java:127)位于org。日食码头。服务器服务器在org上处理(Server.java:500)。日食码头。服务器HttpChannel。org上的lambda$handle$1(HttpChannel.java:383)。日食码头。服务器HttpChannel。在org上发送(HttpChannel.java:547)。日食码头。服务器HttpChannel。在org上处理(HttpChannel.java:375)。日食码头。服务器HttpConnection。org上的onFillable(HttpConnection.java:270)。日食码头。伊奥。AbstractConnection$ReadCallback。在org上成功(AbstractConnection.java:311)。日食码头。伊奥。我很感兴趣。fillable(FillInterest.java:103)位于org。日食码头。伊奥。2美元。在org上运行(ChannelEndPoint.java:117)。日食码头。util。线策略吃什么就吃什么。org上的runTask(eatwatyoukill.java:336)。日食码头。util。线策略吃什么就吃什么。doProduce(eatwatyoukill.java:313)位于org。日食码头。util。线策略吃什么就吃什么。tryProduce(eatwatyoukill.java:171),网址:org。日食码头。util。线策略吃什么就吃什么。在org上运行(eatwatyoukill.java:129)。日食码头。util。线ReservedThreadExecutor$ReservedThread。在org上运行(ReservedThreadExecutor.java:388)。日食码头。util。线队列线程池。org上的runJob(QueuedThreadPool.java:806)。日食码头。util。线QueuedThreadPool$Runner。在java上运行(QueuedThreadPool.java:938)。base/java。朗。丝线。运行(Thread.java:829)的原因是:java。lang.ClassNotFoundException:io。开放普查。查出传播java上的TextFormat$Setter。base/java。网URLClassLoader。java上的findClass(URLClassLoader.java:471)。base/java。lang.ClassLoader。java上的loadClass(ClassLoader.java:589)。base/java。lang.ClassLoader。loadClass(ClassLoader.java:522)。。。还有47个

设置:

如您所见,我从这里使用云触发器java示例代码:https://cloud.google.com/functions/docs/calling/storage?hl=de#functions-calling-storage-java

我已经从这里通过静态函数扩展了代码:https://cloud.google.com/run/docs/authenticating/service-to-service#acquire-token

最后一个演示类的代码:

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函数
——入口点函数。HelloGcs
--运行时java11
--内存512MB
--触发器资源您的_trigger_BUCKET_NAME
--触发器事件google。存储对象定稿

函数的所有者是一个附加服务号(如这里所述https://cloud.google.com/run/docs/authenticating/service-to-service章"设置服务号")

提前感谢,我们将非常感谢您的帮助。

共有1个答案

鲍建业
2023-03-14

例外情况是,您所依赖的外部库在程序的类路径上不可用。

解决这个问题的最简单方法是将代码作为胖jar提交,以便所有依赖项在运行时都可用。

 类似资料:
  • 我正试图开始使用Rust FFI,所以我去了FFI上的nomicon留档,尝试复制“外国呼叫约定”示例。 我编写了一段简单的代码,只需复制粘贴示例,并尝试使用声明的函数: 这真的没有什么用处,我只是想看看我是否可以链接并调用一个函数,而不会让一切都爆炸。 我从编译器中得到这个错误: 这个例子过时了吗?我是不是漏掉了什么明显的东西?看起来不管怎样,我声明的应该在范围内。 我知道winapi板条箱,但

  • 问题内容: 这是我认为不遵循应执行的代码的代码段: 如果我发表评论 该代码显然无法正常工作。如果我取消注释,那就可以了! 注意:只要按“ s”开始游戏,start就为true。但是,该方法在一开始就被调用,因此应多次无限制地显示“ hi”,直到按“ s”键为止。 图片说出一千个单词,所以我给你数百张图片(视频)来解释我的意思:https : //dl.dropbox.com/u/2792692/C

  • 这是我认为不遵循代码应该做什么的代码片段: 如果我发表评论 代码显然不起作用。如果我取消注释,它就会取消注释! 注意:只要按“s”开始游戏,启动就是真的。但是,该方法在开始时被调用,因此“hi”应该显示多次并无限期地显示,直到我按“s”键。 一张图片说一千个字,所以我给你几百张图片(视频)来解释我的意思:https://dl.dropbox.com/u/2792692/CodeWeird.ogv

  • 我定义了一个布局,以便代理根据数据库中的列表从一个矩形节点移动到另一个矩形节点。因此,例如,代理1将前往“通道”701,然后前往702,等等。 布局示例 特工们从左上角进入,沿着x走到那一行的末尾,然后向下走到底部,再向右走,参观他们途中的“车道”。 然而,我注意到一个代理的第一条车道在右下角,所以它不是沿着路径穿过然后向下,而是使用最短的距离,沿着对角线直行到拐角的车道: 软件中有什么东西我可以

  • 问题内容: MySQL的NOW()是否遵循系统的时区或某些标准,例如GMT或UTC? 问题答案: 在当前时区。从5.1文档: 以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式返回当前日期和时间作为值,具体取决于该函数是在字符串上下文中还是在数字上下文中使用。该值以当前时区表示。 现在,“当前时区”可能意味着不同的含义: 系统时区 通常为MySQL服务器指

  • 我正在考虑这个工厂设计模式的例子,假设我有两个客户端使用这个通知库,在下面的例子中,各个客户端的代码如下所示。 案例1:没有工厂模式 客户端1 客户端2 案例2:使用工厂模式 客户端1 客户端2 所以现在假设通知团队在他们的库中添加了一个新的通知系统,如果假设客户端2想要包含它,那么在情况1中我必须更改具体类名,在情况2中我必须将字符串值更改为新值,所以无论如何,在这两种情况下我都必须进行更改。