SBT 下的应用 运行 未从类路径 jar 中找到 class
App running under SBT doesn't find a class from Classpath jar
我有一个使用 sbt 的 Scala 项目。它 运行 在 Eclipse 下非常好,但是,尝试在 sbt 下 运行 它(sbt 'run mount 1440'
— 包括我需要的参数)导致 ClassNotFoundException
— 它找不到jnr.ffi.provider.jffi.NativeClosureProxy
class。但是,运行ning sbt 'last run'
向我显示 jnr-ffi-2.0.3.jar
文件(其中包括所述 class)实际上包含在 class 路径中。对正在发生的事情有什么建议吗?
github 上可用的资源:https://github.com/FileJunkie/vkfs
您的构建 sbt 无效。
首先,你需要在libraryDependecy
之间有空行。
lazy val root = (project in file(".")).
settings(
name := "vkfs",
version := "1.0",
scalaVersion := "2.11.7"
)
libraryDependencies += "org.scalaj" %% "scalaj-http" % "1.1.6"
libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.2.11"
libraryDependencies += "com.github.serceman" % "jnr-fuse" % "0.1"
其次,无法解析依赖"com.github.serceman"。这意味着
- 您已将依赖项手动安装到位于
.ivy
或 的 Ivy 存储库
- 您没有指定正确的解析器(参见 http://www.scala-sbt.org/0.13/docs/Resolvers.html)
所以总而言之,似乎 Eclipse 自动做了一些事情,所以你的程序 运行s。当涉及到您的 build.sbt
时,它无效(缺少空行)并且无法正确解析依赖关系。 我想知道,你怎么能从 sbt 'run mount 1440'
开始。
更正空行和 运行ning sbt 'run mount 1440' 我得到
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Set current project to vkfs (in build file:/home/.../IdeaProjects/vkfs/)
[info] Updating {file:/home/.../IdeaProjects/vkfs/}root...
[info] Resolving com.github.serceman#jnr-fuse;0.1 ...
[warn] module not found: com.github.serceman#jnr-fuse;0.1
[warn] ==== local: tried
[warn] /home/.../.ivy2/local/com.github.serceman/jnr-fuse/0.1/ivys/ivy.xml
[warn] ==== public: tried
[warn] http://repo1.maven.org/maven2/com/github/serceman/jnr-fuse/0.1/jnr-fuse-0.1.pom
[info] Resolving jline#jline;2.12.1 ...
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: UNRESOLVED DEPENDENCIES ::
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: com.github.serceman#jnr-fuse;0.1: not found
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
sbt.ResolveException: unresolved dependency: com.github.serceman#jnr-fuse;0.1: not found
at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:213)
at sbt.IvyActions$$anonfun$update.apply(IvyActions.scala:122)
at sbt.IvyActions$$anonfun$update.apply(IvyActions.scala:121)
[ ... truncated ... ]
编辑(关于来自 jcenter 的依赖)
将以下行添加到您的 build.sbt(记住多余的空行)
resolvers += Resolver.jcenterRepo
将 jcenter 添加到您的解析器列表。
编辑 2
Resolver.jcenterRepo 在 SBT 0.13.5 中不可用,因此
resolvers += "jcenter" at "https://jcenter.bintray.com/"
为必填项。
编译成功后和运行相关错误为
java.lang.RuntimeException: java.lang.NoClassDefFoundError: jnr/ffi/provider/jffi/NativeClosureProxy
at jnr.ffi.provider.jffi.NativeClosureProxy.newProxyFactory(NativeClosureProxy.java:220)
最终结果
v 0.1 中的库 "com.github.serceman" 似乎有问题,因为它无法通过反射正确实例化某些 class。
解决方案
通过将 fork in run := true
添加到 build.sbt
来解决问题。
我有一个使用 sbt 的 Scala 项目。它 运行 在 Eclipse 下非常好,但是,尝试在 sbt 下 运行 它(sbt 'run mount 1440'
— 包括我需要的参数)导致 ClassNotFoundException
— 它找不到jnr.ffi.provider.jffi.NativeClosureProxy
class。但是,运行ning sbt 'last run'
向我显示 jnr-ffi-2.0.3.jar
文件(其中包括所述 class)实际上包含在 class 路径中。对正在发生的事情有什么建议吗?
github 上可用的资源:https://github.com/FileJunkie/vkfs
您的构建 sbt 无效。
首先,你需要在libraryDependecy
之间有空行。
lazy val root = (project in file(".")).
settings(
name := "vkfs",
version := "1.0",
scalaVersion := "2.11.7"
)
libraryDependencies += "org.scalaj" %% "scalaj-http" % "1.1.6"
libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.2.11"
libraryDependencies += "com.github.serceman" % "jnr-fuse" % "0.1"
其次,无法解析依赖"com.github.serceman"。这意味着
- 您已将依赖项手动安装到位于
.ivy
或 的 Ivy 存储库
- 您没有指定正确的解析器(参见 http://www.scala-sbt.org/0.13/docs/Resolvers.html)
所以总而言之,似乎 Eclipse 自动做了一些事情,所以你的程序 运行s。当涉及到您的 build.sbt
时,它无效(缺少空行)并且无法正确解析依赖关系。 我想知道,你怎么能从 sbt 'run mount 1440'
开始。
更正空行和 运行ning sbt 'run mount 1440' 我得到
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Set current project to vkfs (in build file:/home/.../IdeaProjects/vkfs/)
[info] Updating {file:/home/.../IdeaProjects/vkfs/}root...
[info] Resolving com.github.serceman#jnr-fuse;0.1 ...
[warn] module not found: com.github.serceman#jnr-fuse;0.1
[warn] ==== local: tried
[warn] /home/.../.ivy2/local/com.github.serceman/jnr-fuse/0.1/ivys/ivy.xml
[warn] ==== public: tried
[warn] http://repo1.maven.org/maven2/com/github/serceman/jnr-fuse/0.1/jnr-fuse-0.1.pom
[info] Resolving jline#jline;2.12.1 ...
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: UNRESOLVED DEPENDENCIES ::
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: com.github.serceman#jnr-fuse;0.1: not found
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
sbt.ResolveException: unresolved dependency: com.github.serceman#jnr-fuse;0.1: not found
at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:213)
at sbt.IvyActions$$anonfun$update.apply(IvyActions.scala:122)
at sbt.IvyActions$$anonfun$update.apply(IvyActions.scala:121)
[ ... truncated ... ]
编辑(关于来自 jcenter 的依赖)
将以下行添加到您的 build.sbt(记住多余的空行)
resolvers += Resolver.jcenterRepo
将 jcenter 添加到您的解析器列表。
编辑 2
Resolver.jcenterRepo 在 SBT 0.13.5 中不可用,因此
resolvers += "jcenter" at "https://jcenter.bintray.com/"
为必填项。
编译成功后和运行相关错误为
java.lang.RuntimeException: java.lang.NoClassDefFoundError: jnr/ffi/provider/jffi/NativeClosureProxy
at jnr.ffi.provider.jffi.NativeClosureProxy.newProxyFactory(NativeClosureProxy.java:220)
最终结果
v 0.1 中的库 "com.github.serceman" 似乎有问题,因为它无法通过反射正确实例化某些 class。
解决方案
通过将 fork in run := true
添加到 build.sbt
来解决问题。