【问题标题】:SBT SCALA java.lang.ClassNotFoundException: javax.mail.AuthenticatorSBT SCALA java.lang.ClassNotFoundException: javax.mail.Authenticator
【发布时间】: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


【解决方案1】:

我通常使用这个plugin 来创建jar。 尝试将其添加到您的 plugins.sbt 文件中

并运行此命令来创建 jar:

sbt "set test in assembly := {}" assembly

然后尝试再次运行您的 jar。

【讨论】:

    【解决方案2】:

    感谢 Markus Appel、Luis Miguel Mejia Suarez 和 Mahmoud Hanafy。正如你所建议的那样,我使用了汇编,它对我来说很好。

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2012-03-30
      • 2017-08-13
      • 2017-09-08
      相关资源
      最近更新 更多