2013-08-01 138 views
8

我有類Hello。我已經成功編譯了.class文件,並將其放在dir/subdir目錄中,並在其代碼中爲其分配了dir.subdir包。我想用命令java命令來運行它。使用Java應用程序啓動器

我用命令運行它:java dir/subdir /你好它運行成功!但我在docs中讀到它應該用完全合格的類名完成。我試圖執行:java dir.subdir.Hello它也成功運行了!

以下哪種方法是正確的方法,更正確?他們每個人的具體含義是什麼?他們的根本區別是什麼?

回答

0

使用軟件包名稱(帶點)更好,因爲它是跨平臺的(請記住,Windows使用\),並且更接近於您的程序需要的jar文件所需的內容(其中Main-Class必須是指定爲類名稱)。

+0

但是,如果我確定它不在一個罐子裏?例如,Linux的差異? –

+0

從jar中啓動Java程序時,該類不是在命令行中指定的,而是在jar的'Manifest'中指定爲'Main-Class'。爲了保持一致性,最好使用基於點的名稱。 – chrylis

+0

這裏根本沒有跨平臺的問題。在Windows和Linux上都需要使用'/',否則不能使用'\\' – Brian

1

您應該使用虛線形式,但不是因爲平臺兼容性。

參數dir/subdir/Hello在此處有效,因爲Java的默認ClassLoader實現正確處理它。但是,並非所有的ClassLoader實現都支持這一點。您應該使用虛線形式,因爲根據ClassLoader.loadClass中的文檔,名稱應該是binary names。該JLS定義JLS 13.1二進制名,第1項:

類或接口必須由它的二進制名稱來命名,必須符合下列限制:

  • 頂級的二進制名稱類型是它的規範名稱。

  • 成員類型的二進制名稱由其立即封閉類型的二進制名稱組成,後跟$,後跟簡單名稱的成員。

  • 本地類的二進制名稱由其立即封閉類型的二進制名稱組成,後跟$,後跟一個非空的數字序列,接着是本地類的簡單名稱。

  • 匿名類的二進制名稱由其立即封閉類型的二進制名稱組成,後跟$,後跟非空的數字序列。

  • 由泛型類或接口聲明的類型變量的二進制名稱是其立即封閉類型的二進制名稱,後跟$,後跟簡單名稱的類型變量。

  • 由泛型方法聲明的類型變量的二進制名稱是聲明該方法的類型的二進制名稱,後跟$,後面跟隨Java虛擬機規範Java SE中定義的方法描述符7版,其次是$,後面跟着這個類型變量的簡單名稱。

  • 由泛型構造函數聲明的類型變量的二進制名稱是聲明構造函數的類型的二進制名稱,後跟$,後面跟着Java虛擬機規範Java SE中定義的構造函數的描述符7版,其次是$,後面跟着這個類型變量的簡單名稱。

0

你應該總是使用點,因爲這適用於所有的操作系​​統(WIN/UNIX/MAC)。包只是目錄結構,在Windows中用斜槓(/)處理,所以Java能夠運行你的程序沒有任何錯誤。

0

絕對使用它的點然後能夠跨平臺運行。 Mac/Windows/Linux