我编写了一个程序,并将其转换为jar文件。jar文件在我的电脑上运行得很好。当我尝试在将要运行的服务器上运行程序时,jar文件不起作用。我得到这个错误。
Exception in thread "main" java.lang.NoClassDefFoundError: Publish
Caused by: java.lang.ClassNotFoundException: Publish
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: Publish. Program will exit.
我认为这个问题是由不同版本的java或不同的环境或其他原因引起的。我认为库不是问题所在,而是这个程序运行的环境。jar文件在我自己的电脑上运行得很好。
我的java版本java版本"1.6.0_22"Java(TM)SE运行时环境(内部版本1.6.0_22-b04)Java HotSpot(TM)客户端虚拟机(版本17.1-b03,混合模式,共享)
服务器java版本java版本"1.6.0_24"Java(TM)SE运行时环境(内部版本1.6.0_24-b07)Java HotSpot(TM)64位服务器虚拟机(内部版本19.1-b02,混合模式)
我也收到了这个错误,这表明我可能有一个32位的java,而服务器有一个64位,这可能会导致问题。
初始化虚拟机时出错无法为对象堆保留足够的空间
我只需要分配一些内存来运行这个进程,就可以轻松地绕过这个错误。
有人知道如何解决这个问题吗?
注意:我还查看了清单文件,它看起来很好
您使用的是不带包的Publish
。这意味着java期望这个类在默认包中。
您需要使用完全限定的名称,例如:foo.bar.Publish
来自文件:
默认情况下,第一个非选项参数是要被调用。应该使用完全限定的类名。如果罐子选项,第一个非选项自变量是JAR档案,包含应用程序的类和资源文件,其中启动类由Main class清单标头指示。
您需要包含完整的包名称。这个错误不是32/64位操作系统的错误,也不是Java环境中的差异。