Kubeless JVM 运行时实战指南:用 Java 与 Scala 打包并部署 JVM 函数
后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载Kubeless 原生支持多种语言的 Serverless 函数除了常见的 Node.js、Python、Go 之外还提供了基于 Java 虚拟机JVM的运行时变体。本指南以仓库 examples/jvm 目录中的示例文档为主线完整讲解如何把编译好的 JVM 代码Java/Scala打包成自包含的 fat jar并通过kubeless function deploy在 Kubernetes 上运行同时深入剖析 JVM 运行时的函数签名约定、_替代.的 handler 命名规则及其底层原理帮助你在 Kubeless 上快速跑通第一个 JVM 函数。JVM 示例Kubeless 中的编译型语言运行时模板仓库 examples/jvm/Readme.md 的定位非常明确这些示例用于在 Kubeless 中运行编译后的 JVM 代码并作为把其他语言接入 Kubeless 的模板参考。这暗示了 JVM 运行时与解释型运行时如 Node.js 直接提交.js、Python 直接提交.py的本质区别——JVM 函数在部署前需要先在本地完成编译与打包产出的是一个包含全部依赖的 jar 文件而非裸源码。JVM 示例在仓库中的整体编排可以参见 examples/Makefile其中对应的构建与验证目标如下get-jvm-java: kubeless function deploy get-jvm-java --runtime jvm1.8 --from-file jvm/java/test-java-jvm.jar --handler io_ino_Handler.sayHello get-jvm-java-verify: kubeless function call get-jvm-java | grep Hello world可以看到部署命令直接以编译产物test-java-jvm.jar作为--from-file的输入运行时 ID 为jvm1.8验证方式则是调用函数并检查返回内容。这套「构建 → 部署 → 调用」的闭环就是 JVM 运行时在 Kubeless 中的标准工作流。Java 函数Gradle 打包与部署仓库 examples/jvm/java/Readme.md 给出了 Java 函数的完整操作路径核心就两步先用 Gradle 构建带全部依赖的 fat jar再用 kubeless CLI 部署。第一步用 Gradle 构建 fat jargradle shadowJarshadowJar是 Gradle 插件 com.github.johnrengelman.shadow 中buildscript { repositories { jcenter() } dependencies { classpath com.github.jengelman.plugins.shadow:2.0.4 } } apply plugin: java apply plugin: com.github.johnrengelman.shadow version 0.1 jar { manifest { attributes Implementation-Title: jvm-test, Implementation-Version: version } }依赖部分值得注意示例显式声明了 JVM 运行时桥接包de.inoio.kubeless:jvm-runtime:0.1同时引入了log4j作为普通依赖并用 JUnit 支撑测试。也就是说示例中的函数并不依赖 Kubeless 官方仓库提供的io.kubeless参数类而是通过第三方协调包jvm-runtime来获得Event/Context类型——这正体现了 JVM 运行时“以 jar 为交付物、桥接包可替换”的灵活性。构建完成后产物位于build/libs/下文件名形如jvm-test-0.1-all.jarversion为0.1shadow 插件生成-all后缀的完整包。第二步部署函数kubeless function deploy test --runtime jvm1.8 --from-file build/libs/jvm-test-0.1-all.jar --handler io_ino_Handler.sayHello这里出现了一个 JVM 运行时特有的关键约定handler 中的包名路径使用_代替.。即函数类io.ino.Handler中的sayHello方法对应的--handler参数要写成io_ino_Handler.sayHello包名中的.全部替换为_类名与方法名之间仍以.分隔。这条规则在文档中明确强调为“The package name use_instead of.for the path.”是 JVM 函数最容易踩坑的地方。Java 函数签名示例examples/jvm/java/src/main/java/io/ino/Handler.java 给出了标准的 JVM 函数实现package io.ino; public class Handler { public String sayHello(io.kubeless.Event event, io.kubeless.Context context) { System.out.println(event.toString()); return Hello world! AFDFCH; } }函数签名符合 Kubeless 的通用约定接收Event与Context两个参数返回String。这里的io.kubeless.Event/io.kubeless.Context由依赖中的jvm-runtime包提供与 Kubeless 官方 Java 运行时见 docs/runtimes.md中约定的类型命名保持一致便于你从官方运行时切换到自定义 JVM 桥接。Scala 函数sbt assembly 打包与部署examples/jvm/scala/Readme.md 提供了 Scala 版本的完整示例。构建工具换成了 sbt打包任务为 assembly。构建 fat jarsbt assemblysbt-assembly插件由 examples/jvm/scala/project/assembly.sbt 引入addSbtPlugin(com.eed3si9n % sbt-assembly % 0.14.7)examples/jvm/scala/build.sbt 中除配置插件外还指定了产物名称、Scala 版本与依赖assemblyJarName in assembly : scala-test.jar organization : de.inoio scalaVersion : 2.12.1 libraryDependencies de.inoio.kubeless % jvm-runtime % 0.1注意 Scala 示例同样以de.inoio.kubeless:jvm-runtime:0.1作为 JVM 桥接依赖产物名称被固定为scala-test.jar构建后位于target/scala-2.12/目录下。部署与已知限制kubeless function deploy testscala --runtime jvm1.8 --from-file target/scala-2.12/scala-test.jar --handler de_inoio_Handler.fooBarhandler 规则与 Java 完全一致de.inoio.Handler的fooBar方法写作de_inoio_Handler.fooBar。文档同时给出了一个重要的已知限制提示Scala 示例生成的 jar 对存储后端来说体积过大此时需要改为把 jar 的 URL 传给--from-file而非本地文件路径。这也是 Scala 等依赖链较重的语言在 Serverless 部署中的典型注意事项——注意控制最终 jar 的体积或改用可被函数构建器拉取的远程地址。Scala 函数签名示例examples/jvm/scala/src/main/scala/de/inoio/Handler.scala 展示了 Scala 风格的实现package de.inoio import io.kubeless.{Context, Event} class Handler { def fooBar(event: Event, context: Context): String { FOO Bar aus Hamburg } }与 Java 版本相比Scala 示例将Event与Context通过import io.kubeless.{Context, Event}显式引入函数体直接返回字符串。可以看到无论 Java 还是 ScalaJVM 函数的核心契约就是(Event, Context) String。深入 JVM 运行时Event/Context 契约与官方 Java 运行时对照要理解 JVM 示例为什么这样写可以对照 Kubeless 官方文档 docs/runtimes.md 中 Java 运行时的说明。官方 Java 运行时要求函数使用io.kubeless作为包名导入io.kubeless.Event与io.kubeless.Context函数必须是public类中的方法签名接收Event和Context两个输入、返回String部署时--handler采用Classname.Methodname格式例如kubeless function deploy get-java --runtime java1.8 --handler Foo.foo --from-file Foo.java官方 Java 运行时还支持通过 Mavenpom.xml声明依赖部署命令如下详见 examples/java 与 docs/runtimes.mdkubeless function deploy get-java-deps --runtime java1.8 --handler Hello.sayHello --from-file java/HelloWithDeps.java --dependencies java/pom.xmlMaven 构建参数可通过环境变量传入例如代理配置kubeless function deploy get-java --runtime java1.8 --handler Foo.foo --from-file Foo.java --env MAVEN_OPTS-DproxySettrue -DproxyHostproxy_host -DproxyPortproxy_port而 JVM 示例所走的是一条不同的路线不提交源码、直接提交编译后的 fat jar运行时 ID 使用jvm1.8非官方运行时的java1.8。jvm1.8运行时在 docs/runtimes.md 中通过kubeless get-server-config输出的支持运行时清单里并未直接出现官方清单为java1.8等从仓库结构看jvm1.8属于社区/自定义运行时变体因此示例中才需要自带jvm-runtime桥接依赖来提供Event/Context类型。无论走哪条路线Event与Context的字段语义都可以从 Kubeless 的 Go 侧参数定义 pkg/functions/params.go 得到印证// Event includes information about the event source type Event struct { Data string EventID string EventType string EventTime string EventNamespace string Extensions Extension } // Context includes information about the function environment type Context struct { FunctionName string Timeout string Runtime string MemoryLimit string }Event承载事件来源信息数据、事件 ID/类型/时间/命名空间以及可扩展字段Context则描述函数运行环境函数名、超时、运行时、内存限制。JVM 运行时中的io.kubeless.Event/io.kubeless.Context在语义上即对应这套模型这也是所有 Kubeless 运行时统一遵循的函数入参契约。快速上手清单与排错提示结合上述内容在 Kubeless 上部署 JVM 函数的完整流程可归纳为编写函数实现(Event, Context) String签名的方法参考 examples/jvm/java/src/main/java/io/ino/Handler.java 或 examples/jvm/scala/src/main/scala/de/inoio/Handler.scala打包Java 用gradle shadowJar配置见 examples/jvm/java/build.gradleScala 用sbt assembly配置见 examples/jvm/scala/build.sbt产出包含全部依赖的 fat jar部署kubeless function deploy name --runtime jvm1.8 --from-file jar路径或URL --handler 包名用_分隔的类名.方法名验证通过kubeless function call name调用并检查输出或在 examples/Makefile 中直接复用get-jvm-java与get-jvm-java-verify目标。常见注意事项handler 命名包名中的.必须替换为_例如io.ino.Handler.sayHello→io_ino_Handler.sayHellojar 体积若 jar 过大导致存储后端无法承载需将 jar 发布到可访问的 URL 并在--from-file中传入该 URLScala 示例即有此限制桥接依赖使用jvm1.8这类自定义运行时需在项目中引入de.inoio.kubeless:jvm-runtime:0.1以保证io.kubeless.Event/Context类型可用运行时差异官方java1.8运行时提交 Java 源码并由 Maven 构建而jvm1.8运行时直接消费编译后的 jar二者部署参数与构建流程不同请根据实际运行时选择对应流程。至此你已掌握 Kubeless JVM 运行时从构建、打包到部署、验证的完整链路并理解了其函数签名约定与_命名规则的底层逻辑。这套「先编译打包、再上传 jar」的模式同样适用于任何基于 JVM 的语言可作为在 Kubeless 中接入新 JVM 系语言的起点模板。赞分享后端云原生微服务【免费下载链接】kubelessKubernetes Native Serverless Framework项目地址https://gitcode.com/gh_mirrors/ku/kubeless点击查看免费下载相关推荐Windows 文件被占用PowerToys 文件锁匠 3 步帮你快速释放文件占用Windows 文件被占用PowerToys 文件锁匠 3 步帮你快速释放文件占用 你想删除或移动一个文件Windows 却提示文件被另一个程序占用。P后端云原生微服务JCSprout 精读Java 运行时内存划分与 JVM 内存参数实战指南JCSprout 精读Java 运行时内存划分与 JVM 内存参数实战指南 导读本文以 JCSprout 仓库中的 MD/MemoryAllocation.文档知识库后端教程Deeplearning4J SameDiff深度解析JVM里的自动求导与图执行框架如何超越传统APIDeeplearning4J SameDiff深度解析JVM里的自动求导与图执行框架如何超越传统API SameDiff 是 Deeplearning4JD后端云原生微服务上一篇ScanTailor Advanced终极扫描文档处理完全指南下一篇FAST Colors 像素读取实战指南详解 PixelBlob.getPixel(x, y) 接口与 ImageDataPixelBlob 实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Hazelcast Jet 分区剪枝(Partition Pruning)设计解析:从成员剪枝到扫描分区剪枝

Hazelcast Jet 分区剪枝(Partition Pruning)设计解析:从成员剪枝到扫描分区剪枝

缓存KV存储消息队列流处理后端 【免费下载链接】hazelcast Hazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on data-in-motion for real-time insights. 项目地址: htt…

2026/10/7 9:37:27 阅读更多 →
Marketing Skills不是营销技巧,而是价值传递操作系统

Marketing Skills不是营销技巧,而是价值传递操作系统

1. 这不是“营销课”,而是一套可拆解、可验证、可复用的职业生存操作系统“marketingskills”这个词最近在招聘平台、自由职业接单站和职场社群里高频出现,但它绝不是指“学点公众号排版”或“背几个转化率公式”就能应付的泛泛概念。我带过37个转行做私…

2026/10/7 9:37:27 阅读更多 →
OpenShell:用定制开始菜单把Windows 10/11效率拉满

OpenShell:用定制开始菜单把Windows 10/11效率拉满

刚接触 OpenShell 的朋友,可能一开始会觉得它只是个“把 Win7 开始菜单搬回 Windows 10/11”的老古董插件。但我在多台工作机、服务器和家用机上实际跑了一段时间后,感受完全不一样:它解决的不是“怀旧”问题,而是“效率”和“可控…

2026/10/7 9:37:27 阅读更多 →

最新新闻

Spring Boot+Vue民宿预订系统:从表设计到并发防超卖实战

Spring Boot+Vue民宿预订系统:从表设计到并发防超卖实战

前阵子帮一位做民宿的朋友做了一套客房预订管理系统,技术栈选了 Spring Boot Vue。他原本的运营方式是微信接单、Excel 记房态,旺季一到预订信息和真实房态经常对不上,最离谱的一次是同一间大床房同一天被订出去三次,客人到店才发…

2026/10/7 10:34:17 阅读更多 →
深度强化学习破解动态柔性作业车间调度难题

深度强化学习破解动态柔性作业车间调度难题

简介:面向智能制造与生产管理领域的研究者,这份资源针对多任务并行、设备负载波动、紧急插单等动态生产场景,提供基于深度强化学习的柔性作业车间调度完整实现方案。压缩包共181个文件,总大小约2.93MB,主要包括93个PyT…

2026/10/7 10:34:17 阅读更多 →
Flutter多视频同时播放与缓存优化:播放器池与生命周期管理

Flutter多视频同时播放与缓存优化:播放器池与生命周期管理

1. Flutter 里的“同时播放多个视频”到底难在哪 先说结论: Flutter 的 video_player、chewie 这些插件,默认设计就是“一个播放器实例对应一个视频源”,你如果同时在页面里放三个视频,大概率会看到黑屏、声音重叠、甚至直接 OOM…

2026/10/7 10:34:16 阅读更多 →
Linux高频命令实战:从环境检查到日志排障的运维手册

Linux高频命令实战:从环境检查到日志排障的运维手册

初接手一台不熟悉的服务器,心跳通常会加速半拍。环境变量对不对、服务有没有起来、日志在哪写、磁盘还剩多少,这些问题不摸清楚,后面每一步都像踩在棉花上。Linux的诱惑和门槛恰好都在同一个地方:一切皆文件、一切可脚本化&#x…

2026/10/7 10:34:15 阅读更多 →
TPOT实战指南:用遗传编程自动化机器学习管道与超参数搜索

TPOT实战指南:用遗传编程自动化机器学习管道与超参数搜索

如果你和我一样,每天跟表格数据打交道,肯定经历过这种循环:清洗、编码、试模型、调参、再试模型,小半天就没有了。所谓AutoML,就是把这个循环自动化,而TPOT是其中非常适合“从零上手”的一个库。它能自动搜…

2026/10/7 10:34:13 阅读更多 →
节点CPU占用高?一套通用的排查思路与实战方案

节点CPU占用高?一套通用的排查思路与实战方案

做运维和调试的这些年,“节点CPU占用”这个问题几乎是天天见的。不管是几台物理服务器组成的集群,还是一台边缘网关盒子,或者Windows服务器上那个诡异的System进程,只要CPU飙上去,业务就开始卡,告警就开始响…

2026/10/7 10:33:13 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →