【发布时间】:2018-11-30 10:26:15
【问题描述】:
我有 SBT Scala 项目,该项目向用户发送包含一些信息的电子邮件。使用 IntelliJ 运行一切正常,但我需要构建项目,放在服务器上并从终端运行。
在第一步中,我使用以下命令来构建项目:
sbt clean 编译包
之后我尝试通过以下方式运行它:
scala 目标/scala-2.12/project_name_sbt_2.12-0.1.jar
然后我得到了错误:
java.lang.ClassNotFoundException: javax.mail.Authenticator
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
它是命令行应用程序,我不使用 Tomcat 和其他容器。施工简单易行。我有一个主类:
object MyApp extends App {new SomeService().run()}
我有 build.sbt 之类的:
libraryDependencies ++= Seq(
"org.scalatest" %% "scalatest" % "3.0.5" % "test",
"mysql" % "mysql-connector-java" % "5.1.16",
"org.jsoup" % "jsoup" % "1.11.2",
"joda-time" % "joda-time" % "2.10.1",
"org.apache.commons" % "commons-email" % "1.5"
)
您能否指出解决该问题的正确方向?怎么了?
【问题讨论】:
-
在摆弄依赖关系之前,您可以尝试create a FAT jar 看看是否有效吗?
-
长话短说,当您
package时,SBT 会将您的类编译为 Java 字节码,然后使用这些创建一个 JAR -意味着要运行您的应用程序,您需要在服务器上安装 Scala 以及您的库 (并存在于CLASSPATH)。然而,当你assembly(使用已经指出的插件) 时,SBT 将编译你的类并包含它们以及它的所有依赖项(包括 Scala 标准库) 在一个 JAR 中 - 因此,您只需要 JRE 以java -jar app.jar的身份运行您的应用程序。
标签: java scala apache email sbt