使用SBT构建Scala JAR时遇No main class detected错误求助
问题原因
你的代码是Hive UDF实现类,本身没有main方法,而sbt run命令需要找到包含main方法的类作为程序入口,所以会报"No main class detected"错误。UDF的设计是用于在Hive/Databricks中注册使用,不是直接通过run命令执行的。
解决方案
分两种场景处理:
场景1:仅需打包UDF JAR用于Databricks/Hive
不需要执行sbt run,直接执行打包命令生成JAR文件即可:
sbt package
打包完成后,JAR文件会生成在target/scala-2.12/udfdecrypt_2.12-0.1.0-SNAPSHOT.jar(具体名称根据项目配置略有不同),之后就可以在Databricks中通过spark.udf.register或Hive中ADD JAR+CREATE FUNCTION来使用这个UDF。
场景2:需要本地测试UDF逻辑
如果要在本地测试解密逻辑,添加一个带main方法的测试类:
package com.nm.udf object UdfTest extends App { val udf = new udfDecrypt() // 替换为你的测试加密串和密钥 val testInput = "your-fernet-token-here" val testKey = "your-fernet-key-here" val result = udf.evaluate(testInput, testKey) println(s"解密结果: $result") }
添加后,执行sbt run时sbt会自动识别主类,也可以指定主类运行:
sbt "runMain com.nm.udf.UdfTest"
代码优化建议
- 移除重复导入:代码中重复导入了
java.time.Duration和java.time.Instant,删掉其中一组即可。 - 简化Validator实例化:不需要匿名内部类,直接实例化:
// 原代码 val validator = new Validator() {} // 修改为 val validator = new Validator()
内容的提问来源于stack exchange,提问作者Uyễn Lê
相关产品推荐
相关产品推荐

