【问题标题】:invoke Clojure from Java : java.lang.NumberFormatException: null从 Java 调用 Clojure:java.lang.NumberFormatException: null
【发布时间】:2013-10-17 00:01:32
【问题描述】:

尝试使用here 描述的方法,我最终找到了以下仍然显示异常的简化、缩小代码:

import clojure.lang.RT;

public class FooMain {

    public static void main(String [] args) {
        RT.var("clojure.core", "read-string").invoke("(+ 1 2)"); // line-6
    }
}

在运行时失败,我在帖子末尾附加了跟踪。我已经使用 Clojure 1.4 或 1.5 Ivy deps 尝试过:

<dependency org="org.clojure" name="clojure" rev="1.4.0"/> 

或:

<dependency org="org.clojure" name="clojure" rev="1.5.1"/>

跟踪

 run:
 [echo] ant.java.version=1.7
 [echo] running the app with classpath = /home/mperdikeas/esavo-reg/playground/calling-clojure-from-Java/lib-ivy/clojure-1.4.0-javadoc.jar:/home/mperdikeas/esavo-reg/playground/calling-clojure-from-Java/lib-ivy/clojure-1.4.0-sources.jar:/home/mperdikeas/esavo-reg/playground/calling-clojure-from-Java/lib-ivy/clojure-1.4.0.jar:/home/mperdikeas/esavo-reg/playground/calling-clojure-from-Java/dist/foo.jar
 [java] java.lang.ExceptionInInitializerError
 [java]     at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:194)
 [java]     at org.apache.tools.ant.taskdefs.Java.run(Java.java:771)
 [java]     at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:221)
 [java]     at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:135)
 [java]     at org.apache.tools.ant.taskdefs.Java.execute(Java.java:108)
 [java]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
 [java]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [java]     at java.lang.reflect.Method.invoke(Method.java:601)
 [java]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
 [java]     at org.apache.tools.ant.Task.perform(Task.java:348)
 [java]     at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
 [java]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
 [java]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [java]     at java.lang.reflect.Method.invoke(Method.java:601)
 [java]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
 [java]     at org.apache.tools.ant.Task.perform(Task.java:348)
 [java]     at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398)
 [java]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
 [java]     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [java]     at java.lang.reflect.Method.invoke(Method.java:601)
 [java]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
 [java]     at org.apache.tools.ant.Task.perform(Task.java:348)
 [java]     at org.apache.tools.ant.Target.execute(Target.java:390)
 [java]     at org.apache.tools.ant.Target.performTasks(Target.java:411)
 [java]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
 [java]     at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
 [java]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
 [java]     at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
 [java]     at org.apache.tools.ant.Main.runBuild(Main.java:809)
 [java]     at org.apache.tools.ant.Main.startAnt(Main.java:217)
 [java]     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
 [java]     at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
 [java] Caused by: java.lang.ExceptionInInitializerError
 [java]     at java.lang.Class.forName0(Native Method)
 [java]     at java.lang.Class.forName(Class.java:266)
 [java]     at clojure.lang.RT.loadClassForName(RT.java:2056)
 [java]     at clojure.lang.RT.load(RT.java:419)
 [java]     at clojure.lang.RT.load(RT.java:400)
 [java]     at clojure.lang.RT.doInit(RT.java:436)
 [java]     at clojure.lang.RT.<clinit>(RT.java:318)
 [java]     at FooMain.main(FooMain.java:6)
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [java]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [java]     at java.lang.reflect.Method.invoke(Method.java:601)
 [java]     at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:217)
 [java]     at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:152)
 [java]     ... 34 more
 [java] Caused by: java.lang.NumberFormatException: null
 [java]     at java.lang.Integer.parseInt(Integer.java:454)
 [java]     at java.lang.Integer.valueOf(Integer.java:582)
 [java]     at clojure.core$fn__6145.invoke(core.clj:6247)
 [java]     at clojure.core__init.load(Unknown Source)
 [java]     at clojure.core__init.<clinit>(Unknown Source)
 [java]     ... 48 more
 [java] Java Result: -1

【问题讨论】:

  • 第 9 行是否可能是您发布的代码之后的下一行?我刚刚使用 1.5.1 尝试了该代码,但没有收到 NumberFormatException
  • @juan.facorro 是的,我进一步缩小了范围,请参阅更新的代码。

标签: java clojure


【解决方案1】:

您看到的异常是在 Clojure 运行时尝试加载 clojure.core 命名空间时引发的,然后您的任何代码才会被执行。具体来说,似乎是在尝试从类路径上的 clojure/version.properties 资源解析版本号时引发了异常。

  • 确保该资源确实存在。
  • 确保可以从您正在使用的类加载器访问资源。

【讨论】:

  • clojure/version.properties 位于类路径中的 clojure-1.4.0.jar 中,我是否应该通过以下奥秘:stackoverflow.com/questions/13423048/…
  • 你可能 - 可能是 Clojure 不能很好地与 Ant 使用的任何类加载器配合使用。我的第一个想法是在方法的开头添加Thread.currentThread().setContextClassLoader(RT.class.getClassLoader());。祝你好运 - 根据我的经验,很难找到 Clojure 类加载问题。
  • Clojure 和 Ant 之间混乱的相互作用是正确的。直接从命令行调用它(而不是通过 Ant 的 java 任务)可以正常工作,甚至不需要 setContextClassLoader。我可以忍受。
  • 我想我后来偶然发现了答案。请看下面我的回答。它确实与 version.properties 有关,但不是 Clojure / Ant 类加载器的事情。
【解决方案2】:

感谢Alex's answer,我想我找到了答案。

两者:

  • clojure-1.5.1.jar

  • clojure-1.5.1-sources.jar

包括一个clojure/version.properties 文件。但是clojure-1.5.1-sources.jar中的那个不包含可解析的版本,而是有以下内容:

version=${version}

只需从 CLASSPATH 中删除 clojure-1.5.1-sources.jar(或者,在我的情况下,在 &lt;ivy:retrieve&gt; Ant 任务中设置 type="jar")即可解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多