我可以从Eclipse创建的命令行程序运行吗?

时间:2010-02-16 20:49:03

标签: 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.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)

我也试过这个“java -cp / home / roman / workspace / HelloWorld.HelloWorld”。结果我收到以下错误消息:

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)

有人知道我做错了什么吗?提前感谢您的帮助。

9 个答案:

答案 0 :(得分:69)

转到Debug透视图,然后选择刚运行的程序(在<调试选项卡中显示终止,退出值...)右键单击,然后选择属性,在那里可以看到由eclipse启动的整个命令行命令。

你可以在eclipse所做的同一目录中运行同样的命令(参见运行配置,参数,工作目录),它会起作用。

答案 1 :(得分:7)

您必须在类路径中添加eclipse存储HelloWorldSWT.class文件的目录。它是在创建项目时定义的,如“bin”,“build”或“classes”。检查项目属性或搜索HelloWorldSWT.class文件。

假设它是HelloWorldSWT工作区内的build目录,并且您的类没有包(默认包),则该命令应为:

java -cp /home/roman/workspace/HelloWorldSWT/build HelloWorldSWT

或只是更改到该目录并使用:

java -cp . HelloWorldSWT

修改
-cp .表示仅使用实际目录来查找类文件。您还必须添加程序使用的所有库(JAR或其他目录)(数据库,SWT,...)。
有关详细信息,请查看文档:{​​{3}},How Classes are FoundSetting the Classpath

答案 2 :(得分:4)

我做了一些解决方法,以便充分利用Eclipse的便利性。以下是我发现的,对我来说效果很好。希望它会有所帮助: enter image description here

答案 3 :(得分:3)

在我看来,你没有一个名为HelloWorldSWT``的类,而是一个名为HelloWorldSWT的名为HelloWorldSWT的类(你可以通过HellowWorldSWT.java的第一行来确认{1}},您会在其中找到package HelloWorldSWT;

如果是,请进入父目录并键入

java HelloWorldSWT.HelloWorldSWT 这样可行。

答案 4 :(得分:2)

您可能没有正确加载SWT库,因此您的课程无法加载。

SWT库是运行Eclipse时已加载但未在命令行参数中加载的jar的一部分。您是否相应地修改了类路径?

这是一篇关于如何在旧版Eclipse中执行此类操作的旧文章 http://www.ibm.com/developerworks/opensource/library/os-ecgui1/ 今天你将需要不同的罐子与Eclipse的最新版本。它甚至可能归结为一个罐子。

查看SWT FAQ;至少对于Mac Carbon来说,你可以使用一个罐子,我敢打赌你可以为其他平台做到这一点。

另外,我并不是100%确定你可以在openJDK下运行Eclipse,这在你的平台上似乎就是这种情况。

答案 5 :(得分:1)

这是由于JVM无法找到HelloWorld类而导致的问题,因为您的类名为HelloWorldSWT,其中包含main方法。试试

java HelloWorldSWT

答案 6 :(得分:1)

您尚未正确设置类路径。

我认为让IDE构建一个包含所有非jre库的jar文件并从命令行执行它会更方便。

java -jar myprogram.jar

  

如果只能在Eclipse中轻松执行,那么用Eclipse编写的程序有什么用?

这是一个很好的问题,Java应用程序的部署本身就是一门艺术。编译和执行都是 - 如果不复杂 - 至少在手工执行时很麻烦。但Eclipse和其他工具(如Netbeans)可以帮助您轻松地执行这些任务,甚至可以为您打包程序,以便其他不使用这些工具的人也可以轻松地执行这些程序。

答案 7 :(得分:1)

如果要使用Eclipse中的命令行参数运行程序,可以转到Run-&gt; Run Configurations,这将打开一个包含您正在运行的程序的窗口以及一个可以输入的框。参数。

答案 8 :(得分:1)

如果你只想在命令行上看到一些输出,我发现了另一个快速而又脏的解决方案。但从长远来看,这不是一个好的做法

  1. 删除代码中的包声明(Eclipse会抱怨并给你一个红叉,先忽略它),例如package hello;

  2. 保存。

  3. 打开命令行并导航,直到您进入src文件夹(使用cd)。

  4. 编译java文件,例如javac HelloWorld.java

  5. 执行java类文件,例如java HelloWorld

  6. 它应该可以工作,只要你在正确的目录中没有代码中的任何包声明!包声明确实会导致问题..并且设置Eclipse以确保一切正常,这就是为什么在那里包装声明很好。另一种解决方法是真正去自己设置类路径(每次我必须这样做时总会让我困惑,我很少这样做。)