Scala/Clojure interop在PC上工作,但在另一台PC上使用java.lang.ExceptionInInitializeError失败

Scala/Clojure interop在PC上工作,但在另一台PC上使用java.lang.ExceptionInInitializeError失败,java,scala,clojure,interop,leiningen,Java,Scala,Clojure,Interop,Leiningen,我有一个用Java/Scala混合编写的项目,其中我调用了Clojure生成的类(ca.gsimard.Spaverse.client.clojail)公开的静态方法(epadEval) 在clojail.clj: (与Leinengen一起编译成一个独立的jar:“lein uberjar”) 在main.scala中: (在Eclipse项目中,我导入了以前由Leinengen生成的.jar): 我通过构建胖jar部署项目并运行它: 在PC1(Linux)上: 在PC2(Windows 7)

我有一个用Java/Scala混合编写的项目,其中我调用了Clojure生成的类(ca.gsimard.Spaverse.client.clojail)公开的静态方法(epadEval)

在clojail.clj:
(与Leinengen一起编译成一个独立的jar:“lein uberjar”)

在main.scala中:
(在Eclipse项目中,我导入了以前由Leinengen生成的.jar):

我通过构建胖jar部署项目并运行它:

在PC1(Linux)上:

在PC2(Windows 7)上:

线程“main”java.lang.ExceptionInInitializeError中的异常 位于clojure.lang.Namespace。(Namespace.java:34) 位于clojure.lang.Namespace.findOrCreate(Namespace.java:176) 位于clojure.lang.Var.internPrivate(Var.java:149) 在加利福尼亚州的gsimard.Spacever.client.clojail。(未知来源) 位于ca.gsimard.averster.client.Epad$.eval(EpadClient.scala:78) 位于ca.gsimard.averster.client.Main$.Main(MainClient.scala:25) 位于ca.gsimard.averster.client.Main.Main(MainClient.scala) 原因:java.lang.NullPointerException 在clojure.core$eval1697$fn_u1698.invoke(core.clj:6135) 在clojure.core$eval1697.invoke(core.clj:6135) 位于clojure.lang.Compiler.eval(Compiler.java:6465) 加载(Compiler.java:6902) 位于clojure.lang.RT.loadResourceScript(RT.java:357) 位于clojure.lang.RT.loadResourceScript(RT.java:348) 在clojure.lang.RT.load处(RT.java:427) 在clojure.lang.RT.load(RT.java:398) 在clojure.lang.RT.doInit(RT.java:434) 在clojure.lang.RT.(RT.java:316) ... 还有7个 我对正在发生的事情一无所知:我所知道的是没有发生太多事情。看起来Clojure类甚至没有被加载。在(ns..)和(defn..)之间添加(println..)命令根本不会在PC2上打印任何内容,因此问题似乎出在加载时,而不是调用时

请注意,在失败的同一台Windows7计算机上,我可以使用(-main)方法调用(-epadEval..)成功构建并运行一个只支持Clojure的独立uberjar

知道这是怎么回事吗

编辑:我已经用java-verbose运行了这个,如下所示。据我所知,函数epadEval甚至在定义之前就被调用了!JVM仍在加载clojure.core时发生异常。在那之前,我没有看到任何[装载的ca.gsimard.spacer.client.clojail…]

[Loaded clojure.core$eval1697$fn__1698 from __JVM_DefineClass__]
[Loaded clojure.core$eval1697 from __JVM_DefineClass__]
Exception in thread "main" [Loaded java.lang.Throwable$PrintStreamOrWriter from
C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.lang.Throwable$WrappedPrintStream from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.util.IdentityHashMap$KeySet from C:\Program Files\Java\jre7\lib\rt.jar]
java.lang.ExceptionInInitializerError
    at clojure.lang.Namespace.<init>(Namespace.java:34)
    at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
    at clojure.lang.Var.internPrivate(Var.java:149)
    at ca.gsimard.spacecraft.client.clojail.<clinit>(Unknown Source)
    at ca.gsimard.spacecraft.client.Epad$.eval(EpadClient.scala:78)
    at ca.gsimard.spacecraft.client.Main$.main(MainClient.scala:25)
    at ca.gsimard.spacecraft.client.Main.main(MainClient.scala)
[Loaded java.util.Objects from C:\Program Files\Java\jre7\lib\rt.jar]
Caused by: java.lang.NullPointerException
    at clojure.core$eval1697$fn__1698.invoke(core.clj:6135)
    at clojure.core$eval1697.invoke(core.clj:6135)
    at clojure.lang.Compiler.eval(Compiler.java:6465)
    at clojure.lang.Compiler.load(Compiler.java:6902)
    at clojure.lang.RT.loadResourceScript(RT.java:357)
    at clojure.lang.RT.loadResourceScript(RT.java:348)
    at clojure.lang.RT.load(RT.java:427)
    at clojure.lang.RT.load(RT.java:398)
    at clojure.lang.RT.doInit(RT.java:434)
    at clojure.lang.RT.<clinit>(RT.java:316)
    ... 7 more
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre7\lib\rt.jar]
[从JVM定义类加载clojure.core$eval1697$fn\uu 1698]
[从JVM\u DefineClass\uuu加载clojure.core$eval1697]
线程“main”[Loaded java.lang.Throwable$PrintStreamOrWriter from]中出现异常
C:\ProgramFiles\Java\jre7\lib\rt.jar]
[从C:\Program Files\java\jre7\lib\rt.jar加载的java.lang.Throwable$WrappedPrintStream]
[从C:\Program Files\java\jre7\lib\rt.jar加载的java.util.IdentityHashMap$KeySet]
java.lang.ExceptionInInitializeError
位于clojure.lang.Namespace。(Namespace.java:34)
位于clojure.lang.Namespace.findOrCreate(Namespace.java:176)
位于clojure.lang.Var.internPrivate(Var.java:149)
在加利福尼亚州的gsimard.Spacever.client.clojail。(未知来源)
位于ca.gsimard.averster.client.Epad$.eval(EpadClient.scala:78)
位于ca.gsimard.averster.client.Main$.Main(MainClient.scala:25)
位于ca.gsimard.averster.client.Main.Main(MainClient.scala)
[从C:\Program Files\java\jre7\lib\rt.jar加载的java.util.Objects]
原因:java.lang.NullPointerException
在clojure.core$eval1697$fn_u1698.invoke(core.clj:6135)
在clojure.core$eval1697.invoke(core.clj:6135)
位于clojure.lang.Compiler.eval(Compiler.java:6465)
加载(Compiler.java:6902)
位于clojure.lang.RT.loadResourceScript(RT.java:357)
位于clojure.lang.RT.loadResourceScript(RT.java:348)
在clojure.lang.RT.load处(RT.java:427)
在clojure.lang.RT.load(RT.java:398)
在clojure.lang.RT.doInit(RT.java:434)
在clojure.lang.RT.(RT.java:316)
... 还有7个
[从C:\Program Files\java\jre7\lib\rt.jar加载了java.lang.Shutdown]
[从C:\Program Files\java\jre7\lib\rt.jar加载了java.lang.Shutdown$Lock]
在有人问之前,是的,这个应用程序中有多个线程(使用Akka Actors),是的,对epadEval的调用是通过这样一个actor的receive函数完成的。运行Windows 7的电脑(崩溃)的内核数比运行Linux的2核笔记本电脑(不崩溃)的内核数多。我的猜测是,我只是一直很幸运,我的笔记本电脑上的线程现在

  • 这个猜测有意义吗
  • 如何确保clojail类在某些线程尝试调用其静态函数之前已完全加载

99%的时间,这些问题是由于不同机器之间的环境差异造成的。您没有提到IDE(如果有的话,是Eclipse吗?)

检查JVM版本并确保您使用的是您认为重要的JVM。例如,您可以在Linux上使用openJDK,在Windows上使用Oracle JDK。 在两台机器上运行java--version以检查配置


请发布有关您的配置的更多信息,以便我们进一步提供帮助。

如另一个答案所述,这几乎可以肯定是环境差异

在详细模式下运行java,如下所示:

java -verbose -jar project.jar

将提供大量有关类加载的信息。幸运的是,您将能够从异常发生之前加载的类中推断出一些有用的信息。

Akka使用当前线程(创建ActorSystem的线程)的上下文类加载器(如果有)。这能在这里发挥作用吗?

在main.scala:(在一个Eclipse项目中,我导入了以前由Leinengen生成的.jar)感谢关于JVM版本的建议:今晚我将发布关于这两台机器的更多信息,其中一台我现在无法访问。这看起来很可疑。也许您的scala代码正在使用类加载器?也看到了:不,我不
Epad: 6
Exception in thread "main" java.lang.ExceptionInInitializerError
    at clojure.lang.Namespace.<init>(Namespace.java:34)
    at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
    at clojure.lang.Var.internPrivate(Var.java:149)
    at ca.gsimard.spacecraft.client.clojail.<clinit>(Unknown Source)
    at ca.gsimard.spacecraft.client.Epad$.eval(EpadClient.scala:78)
    at ca.gsimard.spacecraft.client.Main$.main(MainClient.scala:25)
    at ca.gsimard.spacecraft.client.Main.main(MainClient.scala)
Caused by: java.lang.NullPointerException
    at clojure.core$eval1697$fn__1698.invoke(core.clj:6135)
    at clojure.core$eval1697.invoke(core.clj:6135)
    at clojure.lang.Compiler.eval(Compiler.java:6465)
    at clojure.lang.Compiler.load(Compiler.java:6902)
    at clojure.lang.RT.loadResourceScript(RT.java:357)
    at clojure.lang.RT.loadResourceScript(RT.java:348)
    at clojure.lang.RT.load(RT.java:427)
    at clojure.lang.RT.load(RT.java:398)
    at clojure.lang.RT.doInit(RT.java:434)
    at clojure.lang.RT.<clinit>(RT.java:316)
    ... 7 more
[Loaded clojure.core$eval1697$fn__1698 from __JVM_DefineClass__]
[Loaded clojure.core$eval1697 from __JVM_DefineClass__]
Exception in thread "main" [Loaded java.lang.Throwable$PrintStreamOrWriter from
C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.lang.Throwable$WrappedPrintStream from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.util.IdentityHashMap$KeySet from C:\Program Files\Java\jre7\lib\rt.jar]
java.lang.ExceptionInInitializerError
    at clojure.lang.Namespace.<init>(Namespace.java:34)
    at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
    at clojure.lang.Var.internPrivate(Var.java:149)
    at ca.gsimard.spacecraft.client.clojail.<clinit>(Unknown Source)
    at ca.gsimard.spacecraft.client.Epad$.eval(EpadClient.scala:78)
    at ca.gsimard.spacecraft.client.Main$.main(MainClient.scala:25)
    at ca.gsimard.spacecraft.client.Main.main(MainClient.scala)
[Loaded java.util.Objects from C:\Program Files\Java\jre7\lib\rt.jar]
Caused by: java.lang.NullPointerException
    at clojure.core$eval1697$fn__1698.invoke(core.clj:6135)
    at clojure.core$eval1697.invoke(core.clj:6135)
    at clojure.lang.Compiler.eval(Compiler.java:6465)
    at clojure.lang.Compiler.load(Compiler.java:6902)
    at clojure.lang.RT.loadResourceScript(RT.java:357)
    at clojure.lang.RT.loadResourceScript(RT.java:348)
    at clojure.lang.RT.load(RT.java:427)
    at clojure.lang.RT.load(RT.java:398)
    at clojure.lang.RT.doInit(RT.java:434)
    at clojure.lang.RT.<clinit>(RT.java:316)
    ... 7 more
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre7\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre7\lib\rt.jar]
java -verbose -jar project.jar