2010-02-17 63 views
4

我有以下由Eclipse生成的代码(.java文件)。如何在Java中编译.java文件?

import org.eclipse.swt.widgets.Shell; 

import org.eclipse.swt.widgets.Display; 

public class HelloWorldSWT { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setText("Hello world!"); 
     shell.open(); 
     while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 
    } 

} 

现在我想从命令行编译上述文件。我去到源代码所在的目录,我试过两个命令:
1. javac的HelloWorldSWT.java
2. javac的-d /家庭/ MYNAME /工作区/ HelloWorldSWT.java

在这两种情况下,我有同样的错误“导入org.eclipse无法解析”。 /home/myname/workspace/- 是类文件所在的目录。

据我了解,编译器没有看到org.eclipse.swt包。为什么?

难道是因为有问题的软件包位于“/home/myname/workspace/org.eclipse.swt/”(不在“/ home/myname/workspace/org/eclipse/swt /”中)吗?

+1

我知道这是一个严重的问题,但我只是要指出一个欢闹的冠冕堂皇的标题“如何在Java中编译.java文件?”是。 – 2016-10-01 01:41:03

回答

3

您需要设置类路径以便Java编译器知道在哪里可以找到org.eclipse。*类。您可以使用命令行开关或环境变量来完成此操作。

+0

但我虽然在编译过程中指定了“classpath”(使用-d选项)。我虽然在“-d”选项后面加上了我所有软件包所在目录的名称。我理解错吗? – Roman 2010-02-17 09:22:45

+1

Roman -/d是编译类(即.class文件)去的地方... 可以使用CLASSPATH环境变量或使用-classpath选项来设置类路径(不是Java乐趣?的javac程序。 – 2010-02-17 09:32:17

+0

谢谢你,马丁。现在对我来说更清楚了。但是,当我尝试“javac -d/home/myname/workspace/HelloWorldSWT/-classpath/home/myname/workspace/HelloWorldSWT.java”时,仍然收到相同的错误消息。 – Roman 2010-02-17 09:45:33

1

由于您正在进行Eclipse RCP开发,因此您应该让Eclipse处理您的编译。 (您很可能会在项目的“build”或“bin”目录中找到您的课程)。 除了编译之外,还会有一些“打包”步骤来创建最终的应用程序,Eclipse也有相应的工具。

如果你真的想在Eclipse之外构建,你需要管理一个潜在的大型依赖列表(比如org.eclipse.swt.widgets),这使得纯javac不可行。你需要看看Ant或Maven。

另请注意,您将需要类路径来包含不仅用于编译的依赖项,还包括运行该程序时的依赖项。

+0

但是为了理解java中的classpath /依赖机制,从shell完全编译是最好的方法。并使用Notepad ++作为IDE - ) – 2010-02-17 09:21:57

+0

许多人说我会在“build”或“bin”中找到我的类。但是我在/ home/myname/workspace/HelloWorldSWT /中找到了我的类文件。或者我们在谈论不同的事情?在我的简单情况下,依赖关系问题可能会很大吗?我只想要javac看到一个包(org.eclipse)? – Roman 2010-02-17 09:27:56

+0

为了学习classpath /依赖项问题,也许SWT项目不是一个好的开始... – Thilo 2010-02-17 09:38:41

-2

你忘了classpath

+0

但我虽然在编译过程中指定了“classpath”(使用-d选项)。我虽然在“-d”选项后面加上了我所有软件包所在目录的名称。我理解错吗? – Roman 2010-02-17 09:29:44

+0

是的,你明白我的错误。 正好经由-cp选项指定类路径: javac的-cp /jarname.jar; /another_jarname.jar; 等 – 2010-02-17 09:50:21

0

但是我虽然我指定的编译 (使用-d选项)在 “类路径”。我虽然那 “-d”选项后,我把 目录的名称,我的所有包是 位于。我理解错吗?

尝试

javac -help 

,看看有什么不同的命令行选项做。还请注意上面的其他帖子解释了这一点。

从命令行编译并设置类路径和一切正确是一个痛苦。然而,这样做很有用,这样你就可以理解ide在为你自动实现时实际做了什么。

+0

感谢。我有这个想法。 -d指定在编译过程中生成的类文件应该到的目录。 -classpath指定软件包所在的目录。但是当我使用“javac -d/home/myname/workspace/HelloWorldSWT/-classpath/home/myname/workspace/HelloWorldSWT.java”时,我仍然收到旧的错误信息。 – Roman 2010-02-17 09:50:54

0

类路径变量或命令行开关需要指向其中org.eclipse.swt.widgets.Shell类驻留,如果该类是一个JAR文件中,那么类路径需要包含实际的jar文件,

javac -classpath /root/to/jar/eclipse.jar

否则,如果org.eclipse.swt.widgets.Shell类只是一个松散的类文件(我怀疑,我认为这将是里面的eclipse jar文件,一个你可以使用jar -tvf jar-you-think-it-might-be-in.jar列出) ...那么您将需要javac -classpath指向org/eclipse/swt/widgets/路径中顶级目录的位置。

0

@罗曼 - 这个问题对于初学者来说太复杂了,试图解决。问题在于SWT具有复杂的依赖关系,包括对本地代码库的依赖。

您最好使用Eclipse“RunAs”运行您的SWT应用程序......或尝试从命令行查找一些运行基于SWT的应用程序的特定于Eclipse的文档。

+0

Stephen,我能够从Eclipse运行应用程序。我只是设法编译类文件(通过javac -d/home/myname/workspace/HelloWorldSWT/-cp /home/myname/workspace/org.eclipse.swt/swt.jar)。但我仍然不知道如何运行生成的类文件(但它已经是另一个问题了)。 – Roman 2010-02-17 10:10:32

+0

@罗曼 - 运行它是最难的部分。 – 2010-02-17 10:18:59

4

好的,Stephen C 我是亲手做这个工作的。 我只用记事本+ +(我发誓)

  1. 启动记事本++和作者
  2. 创建文件HelloWorldSWT.java
  3. 复印实例保存它!
  4. 打开CMD,进入到目录中HelloWorldSWT.java
  5. 运行命令javac HelloWorldSWT.java

  6. 好了,去到Eclipse目录,找到正确的罐子swt-3.4.2-win32-win32-x86.jar

  7. 运行此再次

    D:\workspaces\spf_workspace\hand-made>javac -cp "D:\Program files\eclipse3_5\plugins\org.eclipse.swt.win32.win32.x86_3.5.1.v3555a.jar" HelloWorldSWT.java

所有过程需要2分钟。

不要尝试运行此:

`D:\workspaces\spf_workspace\hand-made>java -cp "D:\Program files\eclipse3_5\plugins\org.eclipse.swt.win32.win32.x86_3.5.1.v3555a.jar;." HelloWorldSWT` 

注:我补充当前目录。到类路径。

+0

如果你这样运行,SWT将如何找到它的本地(JNI)库? – 2010-02-17 10:57:37

+0

org.eclipse.swt.win32.win32.x86_3.5.1.v3555a.jar包含本地dll,并在运行时将其解压缩到系统tmp dir(默认情况下,java使用system tmp作为默认本地库的占位符) – 2010-02-17 11:01:46