2010-02-17 64 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