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

使用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) 

有人知道我做错了什么吗? 预先感谢您的任何帮助。

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

您可以在同一个dir 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,…)。
有关更多详细信息,您可以查看文档: 如何找到类 , 设置类路径和Java命令

我做了一些解决方法,以便充分利用Eclipse的便利性。 以下是我发现的,它对我来说效果很好。 希望它会有所帮助: 在此处输入图像描述

在我看来,你没有一个名为HelloWorldSWT“的类,而是一个名为HelloWorldSWT的名为HelloWorldSWT (您可以通过HellowWorldSWT.java的第一行来确认这HellowWorldSWT.java ,在那里您可以找到package HelloWorldSWT;

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

java HelloWorldSWT.HelloWorldSWT这样可行。

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

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

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

查看SWT常见问题解答 ; 至少对于Mac Carbon来说,你可以使用一个jar子,我敢打赌你可以为其他平台做到这一点。

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

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

java HelloWorldSWT

您还没有正确设置类路径。

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

java -jar myprogram.jar

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

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

如果要使用Eclipse中的命令行参数运行程序,可以转到Run-> Run Configurations,它将显示一个包含您正在运行的程序的窗口以及一个可以输入参数的框。

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

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

  2. 保存。

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

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

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

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