尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

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:29
Marketing Skills不是营销技巧,而是价值传递操作系统

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

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

📅 2026/10/7 9:37:29
OpenShell:用定制开始菜单把Windows 10/11效率拉满

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

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

📅 2026/10/7 9:37:29
MORE NEWS

更多资讯

📰

ponytail 插件怎么用:轻量级 skill 模块的配置与避坑指南

1. 从“ponytail”这个热词说起:它到底指什么 第一次看到“ponytail”被当成一个技术词条推到我面前的时候,我脑子里蹦出来的其实是发型——马尾辫。但结合“ponytail skill”“ponytail 插件”“插件 ponytail 如何使用”这几个热搜词一起看&#xff0c…

📰

Mac mini 本地AI服务器实战:M系列芯片高效推理与n8n工作流部署

1. 为什么选 Mac mini 搭建本地 AI 服务器?这不是“玩具”,而是经过实测的生产力节点 Mac mini 不是“凑合用”的过渡方案,而是我过去18个月在家庭AI工作流中反复验证后锁定的 最优硬件载体 。很多人看到标题第一反应是:“M系列…

📰

中英文科技期刊集群网站建设复盘:从架构设计到技术落地

做学术期刊集群网站,尤其是中英文双语版本,跟做普通企业站完全是两码事。单刊网站你可以按编辑部喜好随便折腾,但一到集群层面,面对的是几十本甚至上百本风格各异的期刊,统一品牌、统一检索、多语言同步,每…

📰

智慧电厂数字化转型:重构人机电网数协同逻辑

简介:本资源是一份面向电力企业及发电集团数字化转型实践者的《智慧电厂数字化转型建设方案》专业文档,聚焦智慧城市背景下的能源行业智能化升级路径,系统解决生产效率提升、安全风险防控、设备智能运维与科学决策支撑等核心问题。文档为单文…

📰

项目经理被裁无人替他说?职场不可替代性的残酷真相

项目经理被裁那天,一个替他说话的都没有“老K被优化了,今天下午走的。”我听到这个消息时正端着咖啡往工位走。愣了一下,第一反应是去HR那边看看老K还在不在,但转头一想,其实没必要。会议室里那个高个子HR已经抱着电脑…

📰

Agent-Reach 实战:CLI AI Agent 如何触达外部工具与网络

1. Agent-Reach 到底想解决什么问题 第一次看到 Agent-Reach 这个名字,我下意识把它归类成又一个"套壳 Agent 框架"。毕竟这两年 AI Agent 相关的项目实在太多,GitHub 上每天都有新仓库冒出来,大部分是把几个大模型的 API 包一层&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬