【问题标题】:Classpath issue: Scala WAR webapp (jetty) fails to load on Windows but run flawlessly on Linux类路径问题:Scala WAR webapp (jetty) 无法在 Windows 上加载但在 Linux 上完美运行
【发布时间】:2014-09-25 11:17:07
【问题描述】:

在 Windows 8.1 上,每次我启动 jetty (9.12) 时使用

java -jar start.jar

它能够找到并部署我的 WAR,但随后显示错误消息:

>     15:14:17.754 [main] ERROR n.liftweb.http.provider.HTTPProvider - Failed to Boot! Your application may not run properly
>     java.lang.NoClassDefFoundError: scala/Seq
>             at net.liftweb.json.DefaultFormats$.<init>(Formats.scala:175)
> ~[lift-json-2.0.jar:2.0]
>             at net.liftweb.json.DefaultFormats$.<clinit>(Formats.scala)
> ~[lift-json-2.0.jar:2.0]
>             at blah.rest.RestAPI$.<init>(RestAPI.scala:16)
> ~[classes/:na]
>             at blah.rest.RestAPI$.<clinit>(RestAPI.scala)
> ~[classes/:na]
>             at bootstrap.liftweb.Boot.boot(Boot.scala:28) ~[classes/:na]
>             at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_03]
>             at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_03]
>             at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_03]
>             at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.7.0_03]
>     
>     ....

还有

Caused by: java.lang.ClassNotFoundException: scala.Seq
        at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.7.0_03]
        at java.net.URLClassLoader$1.run(Unknown Source) ~[na:1.7.0_03]
        at java.security.AccessController.doPrivileged(Native Method) [na:1.7.0_03]
        at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.7.0_03]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.7.0_03]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.7.0_03]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:436) ~[na:na]
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:389) ~[na:na]
        ... 65 common frames omitted

另一方面,当我在我的 Ubuntu 13.10 环境中部署相同的战争时,它运行时没有任何抱怨。

我已将 CLASSPATH 变量设置为包含 scala(类似于 .;C:\Program Files\Java\jdk1.7.0_03\lib;C:\scala\lib;C:\scala\lib\scala-library. jar) 和适当的 SCALA_HOME。

我也试过了

java -jar start.jar -lib=blah....

有什么我没有做对/我需要做的额外事情吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    这似乎是一个类路径问题。不知何故,它无法找到 Scala 库。

    我建议运行jconsole - 它与标准 JDK 包一起提供。在 Windows 和 Linux 上选择其中的 java 进程并比较类路径。例如我在我的机器上得到这个jconsole:

    VM arguments: 
    
    Class path: 
    /somepath/myapp.jar
    
    Library path: 
    /usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
    
    Boot class path: 
    /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/netx.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/plugin.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/rhino.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jfr.jar:/usr/lib/jvm/java-7-openjdk-amd64/jre/classes
    

    请注意,我的应用程序被打包为单个 jar,并且此 jar 本身位于类路径中。它包含 scala-library-2.10.3.jarscala-reflect-2.10.3.jar 封装在其中。也许在你的情况下,jar 没有 Scala 库,它们也不在类路径上。

    【讨论】:

    • 我检查了 Tomcat 和 Jetty。他们在那里。一件非常奇怪的事情是 WAR 显然已经包含 scala-library.jar 等,在 WEB-INF\lib
    【解决方案2】:

    通过更改针对单个相应 Scala 版本编译的依赖库解决了该问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多