Scala MongoDB: 用 sbt 程序集打包 nosuchmethod 错误
Scala MongoDB: packaging with sbt assembly nosuchmethod error
我一直在尝试弄清楚为什么打包后,我得到
java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
(根据我的操作,还会出现其他错误,但似乎都与class-路径问题有关)
我首先尝试为所有 Mongo 罐子获取最新版本。
我尝试添加
crossScalaVersions := Seq("2.10.0","2.10.6", "2.12.1")
(之前我有:scalaVersion := "2.12.1"
)
我尝试将 Mongo 个 jars 放在 lib 文件夹中。
我确保 sbt clean 然后 sbt assembly
不太确定接下来要尝试什么,我已经用谷歌搜索了几个小时,但还没有找到任何有用的东西。 (我尝试过中间的其他东西,但我真的不记得那些东西是什么 x))
我愿意不使用程序集,我只是不确定如何在没有它的情况下将这些罐子添加到 class路径。
build.sbt(根目录):
organization := "com.domain"
name := "ProjectName"
version := "0.1.0-SNAPSHOT"
//scalaVersion := "2.12.1"
crossScalaVersions := Seq("2.10.0","2.10.6", "2.12.1")
//retrieveManaged := true
//resolvers += "spigot-repo" at "https://hub.spigotmc.org/nexus/content/repositories/snapshots/"
libraryDependencies ++= Seq(
"org.mongodb.scala" % "mongo-scala-driver_2.12" % "1.2.1",
"org.mongodb.scala" % "mongo-scala-bson_2.12" % "1.2.1",
"org.mongodb" % "bson" % "3.4.2",
"org.mongodb" % "mongodb-driver-core" % "3.4.2",
"org.mongodb" % "mongodb-driver-async" % "3.4.2"
// "org.spigotmc" % "spigot-api" % "1.11.2-R0.1-SNAPSHOT"
)
//mappings in (Compile, packageBin) <+= baseDirectory map { base =>
// (base / "in" / "plugin.yml") -> "plugin.yml"
//}
问题来源(每次private val mongoClient = MongoClient()
):
package com.domain.project.package.name
import org.bson.conversions.Bson
import org.mongodb.scala.MongoClient
class MongoWrapper {
// val mongoClientSettings = MongoClientSettings.builder().
// val mongoDriverInfo = MongoDriverInformation.builder().
// val mongoClient: MongoClient = MongoClients.create(settings, mongoDriverInformation)
// private val SERVER = "localhost"
// private val PORT = "27017"
private val DATABASE_NAME = "dbName"
private val mongoClient = MongoClient() //#######ERROR HERE########
val db = mongoClient.getDatabase("dbName")
var collections: Map[String, CollectionWrapper] = Map()
def linkCollection(collectionWrapper: CollectionWrapper) {
collections += collectionWrapper.colName -> collectionWrapper
}
def queueRead(caller: Any, colIn: String, matcher: Bson, func: Any) {
val colOut = collections.get(colIn).get
}
def queueWrite(caller: Any, colIn: String, data: Bson, func: Any) {
val colOut = collections.get(colIn).get
colOut.write(caller, data, func)
}
}
就像我说的,当前错误是
java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
或者它也被
java.lang.NoClassDefFoundError: org/mongodb/scala/MongoClient$
我想在旁注中,未注释时未解决 spigot 依赖项,但这没什么大不了的,我只是将它放在 lib 文件夹中。同样对于 plugin.yml -> 它实际上并没有进入 jar 文件,但这很好 - 我只是解压缩,把它放在那里,然后重新压缩。
无论如何,任何 ideas/solutions 异常将不胜感激,谢谢 :)
更新:现在使用 gradle,但不幸的是没有用:更新
apply plugin: 'java'
apply plugin: 'scala'
repositories {
jcenter()
mavenCentral()
}
jar {
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
}
}
dependencies {
compile group: 'org.scala-lang', name: 'scala-library', version: '2.12.1'
compile files('lib/spigot-api-1.11.2-R0.1-SNAPSHOT-shaded.jar')
compile('org.mongodb.scala:mongo-scala-driver_2.11:1.2.1') {
exclude group: 'org.scala-lang'
}
}
buildscript {
dependencies {
classpath fileTree(dir: 'lib', include: '*.jar')
}
}
jar {
from "plugin.yml"
baseName = 'ProjectName'
version = '0.1.0-SNAPSHOT'
}
我现在明白了:.NoSuchMethodError: scala.Predef$.augmentString(Ljava/lang/String;)Ljava/lang/String
原来我用来为 spigot 加载 scala 的 scala 运行时库已经过时了
我一直在尝试弄清楚为什么打包后,我得到
java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
(根据我的操作,还会出现其他错误,但似乎都与class-路径问题有关)
我首先尝试为所有 Mongo 罐子获取最新版本。
我尝试添加
crossScalaVersions := Seq("2.10.0","2.10.6", "2.12.1")
(之前我有:scalaVersion := "2.12.1"
)
我尝试将 Mongo 个 jars 放在 lib 文件夹中。
我确保 sbt clean 然后 sbt assembly
不太确定接下来要尝试什么,我已经用谷歌搜索了几个小时,但还没有找到任何有用的东西。 (我尝试过中间的其他东西,但我真的不记得那些东西是什么 x))
我愿意不使用程序集,我只是不确定如何在没有它的情况下将这些罐子添加到 class路径。
build.sbt(根目录):
organization := "com.domain"
name := "ProjectName"
version := "0.1.0-SNAPSHOT"
//scalaVersion := "2.12.1"
crossScalaVersions := Seq("2.10.0","2.10.6", "2.12.1")
//retrieveManaged := true
//resolvers += "spigot-repo" at "https://hub.spigotmc.org/nexus/content/repositories/snapshots/"
libraryDependencies ++= Seq(
"org.mongodb.scala" % "mongo-scala-driver_2.12" % "1.2.1",
"org.mongodb.scala" % "mongo-scala-bson_2.12" % "1.2.1",
"org.mongodb" % "bson" % "3.4.2",
"org.mongodb" % "mongodb-driver-core" % "3.4.2",
"org.mongodb" % "mongodb-driver-async" % "3.4.2"
// "org.spigotmc" % "spigot-api" % "1.11.2-R0.1-SNAPSHOT"
)
//mappings in (Compile, packageBin) <+= baseDirectory map { base =>
// (base / "in" / "plugin.yml") -> "plugin.yml"
//}
问题来源(每次private val mongoClient = MongoClient()
):
package com.domain.project.package.name
import org.bson.conversions.Bson
import org.mongodb.scala.MongoClient
class MongoWrapper {
// val mongoClientSettings = MongoClientSettings.builder().
// val mongoDriverInfo = MongoDriverInformation.builder().
// val mongoClient: MongoClient = MongoClients.create(settings, mongoDriverInformation)
// private val SERVER = "localhost"
// private val PORT = "27017"
private val DATABASE_NAME = "dbName"
private val mongoClient = MongoClient() //#######ERROR HERE########
val db = mongoClient.getDatabase("dbName")
var collections: Map[String, CollectionWrapper] = Map()
def linkCollection(collectionWrapper: CollectionWrapper) {
collections += collectionWrapper.colName -> collectionWrapper
}
def queueRead(caller: Any, colIn: String, matcher: Bson, func: Any) {
val colOut = collections.get(colIn).get
}
def queueWrite(caller: Any, colIn: String, data: Bson, func: Any) {
val colOut = collections.get(colIn).get
colOut.write(caller, data, func)
}
}
就像我说的,当前错误是
java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
或者它也被
java.lang.NoClassDefFoundError: org/mongodb/scala/MongoClient$
我想在旁注中,未注释时未解决 spigot 依赖项,但这没什么大不了的,我只是将它放在 lib 文件夹中。同样对于 plugin.yml -> 它实际上并没有进入 jar 文件,但这很好 - 我只是解压缩,把它放在那里,然后重新压缩。
无论如何,任何 ideas/solutions 异常将不胜感激,谢谢 :)
更新:现在使用 gradle,但不幸的是没有用:更新
apply plugin: 'java'
apply plugin: 'scala'
repositories {
jcenter()
mavenCentral()
}
jar {
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
}
}
dependencies {
compile group: 'org.scala-lang', name: 'scala-library', version: '2.12.1'
compile files('lib/spigot-api-1.11.2-R0.1-SNAPSHOT-shaded.jar')
compile('org.mongodb.scala:mongo-scala-driver_2.11:1.2.1') {
exclude group: 'org.scala-lang'
}
}
buildscript {
dependencies {
classpath fileTree(dir: 'lib', include: '*.jar')
}
}
jar {
from "plugin.yml"
baseName = 'ProjectName'
version = '0.1.0-SNAPSHOT'
}
我现在明白了:.NoSuchMethodError: scala.Predef$.augmentString(Ljava/lang/String;)Ljava/lang/String
原来我用来为 spigot 加载 scala 的 scala 运行时库已经过时了