Java 我可以从Eclipse创建的命令行程序运行吗?
我使用Eclipse创建了一个SWT Hello World程序。我能够从Eclipse运行这个程序,它运行得很好 在“/home/myname/workspace/HelloWorldSWT”中,我找到了两个文件:HelloWorldSWT.java和HelloWorldSWT.class。我想从命令行执行相应的程序。首先,我尝试键入“java HelloWorld”,得到以下错误消息:Java 我可以从Eclipse创建的命令行程序运行吗?,java,eclipse,command-line,Java,Eclipse,Command Line,我使用Eclipse创建了一个SWT Hello World程序。我能够从Eclipse运行这个程序,它运行得很好 在“/home/myname/workspace/HelloWorldSWT”中,我找到了两个文件:HelloWorldSWT.java和HelloWorldSWT.class。我想从命令行执行相应的程序。首先,我尝试键入“java HelloWorld”,得到以下错误消息: Exception in thread "main" java.lang.NoClassDefFoundE
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
at gnu.java.lang.MainThread.run(libgcj.so.90)
Caused by: java.lang.ClassNotFoundException: HelloWorld not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
at java.net.URLClassLoader.findClass(libgcj.so.90)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at gnu.java.lang.MainThread.run(libgcj.so.90)
Exception in thread "main" java.lang.NoClassDefFoundError: loaded class HelloWorld.HelloWorld was in fact named HelloWorld
at java.lang.VMClassLoader.defineClass(libgcj.so.90)
at java.lang.ClassLoader.defineClass(libgcj.so.90)
at java.security.SecureClassLoader.defineClass(libgcj.so.90)
at java.net.URLClassLoader.findClass(libgcj.so.90)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at gnu.java.lang.MainThread.run(libgcj.so.90)
我还尝试了这个“java-cp/home/roman/workspace/HelloWorld.HelloWorld”。因此,我收到以下错误消息:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
at gnu.java.lang.MainThread.run(libgcj.so.90)
Caused by: java.lang.ClassNotFoundException: HelloWorld not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
at java.net.URLClassLoader.findClass(libgcj.so.90)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at gnu.java.lang.MainThread.run(libgcj.so.90)
Exception in thread "main" java.lang.NoClassDefFoundError: loaded class HelloWorld.HelloWorld was in fact named HelloWorld
at java.lang.VMClassLoader.defineClass(libgcj.so.90)
at java.lang.ClassLoader.defineClass(libgcj.so.90)
at java.security.SecureClassLoader.defineClass(libgcj.so.90)
at java.net.URLClassLoader.findClass(libgcj.so.90)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at java.lang.ClassLoader.loadClass(libgcj.so.90)
at gnu.java.lang.MainThread.run(libgcj.so.90)
有人知道我做错了什么吗?提前感谢您的帮助。可能是您没有正确加载SWT库,导致类无法加载 SWT库是JAR的一部分,这些JAR在运行Eclipse时已经加载,但没有在命令行参数中加载。您是否相应地修改了类路径 这是一篇关于如何在旧版本的Eclipse中执行这类操作的老文章 今天,在最新版本的Eclipse中,您将需要不同的JAR。它甚至可以归结为一个罐子 看看这个网站;至少对于MacCarbon,你可以使用一个罐子,我敢打赌你可以在其他平台上使用
此外,我不能100%确定您是否可以在openJDK下运行Eclipse,这在您的平台上似乎是如此。这就是问题的原因,因为JVM无法找到HelloWorld类,因为您的类名为HelloWorldSWT,其中包含main方法。试一试
java HelloWorldSWT转到Debug透视图,选择刚刚运行的程序(在Debug选项卡中右键单击,并选择Properties,您可以看到eclipse启动的整个命令行命令
您可以在eclipse所运行的相同目录(请参阅运行配置、参数、工作目录中的)中运行此相同命令,它将正常工作。您必须在类路径中添加eclipse存储HelloWorldSWT.class文件的目录。它是在创建项目时定义的,如“bin”、“build”或“classes”。检查项目属性或搜索HelloWorldSWT.class文件 假设它是HelloWorldSWT工作区内的
build
目录,并且您的类不在任何包(默认包)中,则该命令应为:
java -cp /home/roman/workspace/HelloWorldSWT/build HelloWorldSWT
或者只需更改到该目录并使用:
java -cp . HelloWorldSWT
编辑:-cp.
意味着只有实际目录用于查找类文件。您还必须添加程序使用的所有库(JAR或其他目录)(数据库、SWT等)。有关更多详细信息,请参阅文档:,然后您还没有正确设置类路径 我认为让IDE构建一个包含所有非jre LIB的jar文件并从命令行执行通常更方便 java-jar myprogram.jar 如果用Eclipse编写的程序只能在Eclipse中轻松执行,那么它有什么用途
这确实是一个好问题,java应用程序的部署本身就是一门艺术。编译和执行如果不复杂的话,至少在手工执行时很麻烦。但是Eclipse和Netbeans等其他工具可以帮助您轻松地执行这些任务,甚至可以为您打包程序,以便其他不使用这些工具的人也可以轻松地执行这些程序。在我看来,您没有一个名为HelloWorldSWT``的类,而是名为
HelloWorldSWT
的包中名为HelloWorldSWT
的类(您可以在HelloWorldSWT.java
的第一行找到包HelloWorldSWT;
如果是这样,进入父目录并键入
java HelloWorldSWT.HelloWorldSWT
这是可行的。如果你想在Eclipse中运行带有命令行参数的程序,你可以转到run->run Configurations,它将弹出一个窗口,显示你正在运行的程序以及一个可以输入参数的框。如果你只想看到命令行的一些输出,我找到了另一个快速而肮脏的解决方案是的。但是从长远来看,这不是一个好的做法
package hello;
javac HelloWorld.java
java HelloWorld
只要您在正确的目录下,代码中没有任何包声明,它就应该可以工作!包声明确实会引起问题..而Eclipse的设置是为了确保一切正常,所以在那里有包声明是很好的。另一种解决方法是真正自己设置类路径(每次我必须这样做时,这总是让我感到困惑,我很少这样做)。为了充分利用Eclipse的便利性,我做了一些变通。下面是我发现的,它对我很有效。希望它能有所帮助:
谢谢你的回答。我是Java新手,不了解其本质。我的意思是,在没有Eclipse的情况下,我们需要使用一些复杂的方法来运行SWG应用程序,这对我来说很奇怪。如果用Eclipse编写的程序只能在Eclipse中轻松执行,那么它有什么用呢?如果你想在Eclipse中使用一些易于运行的GUI应用程序Java,不使用SWT,而是Swing。如果使用SWT,则必须管理其依赖关系。在创建RCP应用程序时,平台会为您管理这些依赖关系,但如果是标准程序,则必须使用类路径依赖SWT JAR。我尝试了“Java-c”