我有这个应用程序,您可以使用java宏以批处理模式运行。我有mymacro.java
使用myjar.jar
。为简单起见,我将它们全部放在运行应用程序的同一目录中,因此类路径为"./myjar.jar"
。
运行应用程序的命令是:
theapplication -classpath "./myjar.jar" -batch mymacro.java
-classpath
标记执行它所宣传的内容,即覆盖类路径。现在,这在我的Windows XP PC上运行良好。但是,在Linux集群上运行完全相同的东西时,我得到NoSuchMethodError
。
java.lang.NoSuchMethodError:
com.foo.bar.baz.theMethod(Ljava/lang/String;Ljava/lang/String;)I
我无法想出这个。相同的.java,相同的.jar,相同的theMethod
。类路径不能更简单。正在调用myjar.jar
中的其他方法而没有任何错误。可能出现什么问题?
仅供参考,我在两台机器上将CLASSPATH
环境变量设置为"."
以排除任何冲突。
修改
在我的Windows XP PC上输出java -version
:
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode)
在Linux群集上:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03, mixed mode)
答案 0 :(得分:2)
由于使用的JAR文件的文件名,我遇到过类似的问题。就我而言,我有多个JAR文件,如a.jar
,b.jar
,m.jar
和N.jar
。 m.jar
和N.jar
中都有一个类重复。
在Windows上,N.jar
之后的所有内容始终都会被m.jar
加载。但是在燃烧了大量深夜油之后,我发现* nix上的问题是由于N.jar
首先被加载,然后是a.jar
,b.jar
,m.jar
作为文件与Windows不同,* nix上的名称区分大小写。
请确保您没有任何类似的问题。
答案 1 :(得分:1)
哎呀。该应用程序包含一个NetBeans模块,该模块基本上包含与早期版本的JAR文件相同的代码。所以我的java宏优先访问旧版NBM中的方法,而不是我新版JAR文件中的方法。
当我卸载NBM时,错误消失了。
浪费一整天工作的好方法!
答案 2 :(得分:0)
是
com.foo.bar.baz.theMethod(Ljava/lang/String;Ljava/lang/String;)I
目前在新版本的jar中? 如果不太可能mymacro.java再次编译包含它的jar版本