Scala: не удалось найти основной класс при запуске толстой банки - PullRequest
2 голосов
/ 15 апреля 2020

Недавно я столкнулся с некоторыми проблемами после того, как добавил две зависимости в свой маленький Scala проект. Я больше не могу управлять своим проектом. Error: Could not find or load main class a.b.c.DataExtractor. Я уже целый день искал подобные проблемы, поскольку такая же ошибка появлялась во многих постах, как здесь, так и на других платформах.

Мой толстый фляга создается с помощью сборки sbt.


Seq(
  "org.apache.httpcomponents" % "httpclient" % "4.5.12",
  "org.apache.httpcomponents" % "httpmime" % "4.5.12",
  "org.apache.olingo" % "olingo-odata2-api" % "2.0.11",
  "org.apache.olingo" % "olingo-odata2-core" % "2.0.11",
  "com.azure" % "azure-security-keyvault-secrets" % "4.1.0",
  "com.azure" % "azure-identity" % "1.0.5",
  "org.slf4j" % "slf4j-api" % "1.7.30"
  )

Как только я добавлю зависимости com.azure, их будет гораздо больше, и я больше не смогу запустить свой проект.

В папке target / scala -2.11 у меня есть два необходимых jar-файла:

  • data-extractor-Assembly-0.1.0-SNAPSHOT.jar
  • scala -library-2.11.12.jar

Чтобы запустить приложение, я запускаю следующую команду: java -cp data-extractor-assembly-0.1.0-SNAPSHOT.jar:scala-library-2.11.12.jar -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.showdatetime=true -Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG -verbose a.b.c.DataExtractor

Я предполагаю, что это как-то связано с сборка сборки. Я проверил созданный артефакт и файл MANIFEST.MF отображал Main-Class: a.b.c.DataExtractor, как и ожидалось, но все равно что-то не получается. Я просто не могу понять, в чем причина проблемы.

Итак, Scala 2.11.12, sbt 1.2.8 и Java 1.8.0_162, если это актуально

Любая информация или советы будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

В конце концов мне удалось решить эту проблему с помощью некоторых сборок sbt magi c в файле build.sbt. Я также включаю библиотечные файлы scala, поэтому мне нужно только указать fat-jar для -cp параметр.

assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = true),
assemblyMergeStrategy in assembly := {
  case PathList("javax", "activation", xs @ _*)     => MergeStrategy.last
  case "about.html"                                 => MergeStrategy.rename
  case "plugin.properties"                          => MergeStrategy.last
  case "log4j.properties"                           => MergeStrategy.last
  case "module-info.class" => MergeStrategy.discard
  case PathList("META-INF", xs @ _*) =>
    xs match {
      case ("MANIFEST.MF" :: Nil) => MergeStrategy.discard
      // Concatenate everything in the services directory to keep GeoTools happy.
      case "mailcap" :: Nil => MergeStrategy.last
      case "mimetypes.default" :: Nil => MergeStrategy.last

      case ("services" :: _ :: Nil) =>
        MergeStrategy.concat
      // Concatenate these to keep JAI happy.
      case "javax.media.jai.registryFile.jai" :: Nil | "registryFile.jai" :: Nil |
           "registryFile.jaiext" :: Nil =>
        MergeStrategy.concat
      case name :: Nil => {
        // Must exclude META-INF/*.([RD]SA|SF) to avoid "Invalid signature file digest for Manifest main attributes" exception.
        if (name.endsWith(".RSA") || name.endsWith(".DSA") || name.endsWith(".SF"))
          MergeStrategy.discard
        else
          MergeStrategy.first
      }
      case _ => MergeStrategy.first
    }
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
...