2012-09-07 47 views
0

我很少使用java,所以我對現代生態系統的知識是非常有限的:(。AFAIK,Java是沉重的目錄層次結構和文件名:例如,如果我有一個.jar文件與 「com.mycompany .myapp.WndMain「類,相應的.class文件必須完全命名爲」WndMain.class「(區分大小寫!),並放入」com/mycompany/myapp「目錄樹中.jar文件(實際上是.zip存檔)。是否可以在.jar文件中自動創建目錄層次結構?

但在開發應用程序,我不希望我的源代碼文件被命名爲駝峯匹配,分散在一些目錄樹!這是源代碼,畢竟,我更喜歡的文件被主辦它的方式很舒服me與他們合作,而不是一些愚蠢的編譯器和存檔:)。我想要一個乾淨的「src」文件夾,其中包含「wnd_main.java」,「wnd_about.java」等文件。是否有一些easy方法根據實際的源代碼內容在編譯期間自動生成正確的文件名和目錄結構?

當然,我可以通過Python,Ruby,Shell或其他任何方式創建自己的腳本 - 讀取「.java」文件的內容,解析「使用」和「類」指令,創建目錄結構,複製文件,編譯等......但也許所有這些已經在幾年前完成了,我需要的只是類似於「sudo apt-get install javamake」? :)

回答

0

scons構建系統根據.java文件的內容完美創建目錄結構。安裝和pypm -g install scons一樣簡單。

0

不,編譯器不會讓你聲明文件中聲明的包名稱(如package com.mycopmany.myapp)與磁盤上的實際目錄結構不匹配的類。

這似乎有很多工作要做,以避免在您的src層次結構中存在目錄。

0

這將是一項艱鉅的任務,因爲每個源文件中的包名必須與@mattb所說的目錄結構相同,但是您可以使用一些構建工具,如Ant(最常用的一個)來創建解決方案你正在尋找。

舉例來說,如果你有你的源組織是這樣的:

src 
    foo 
     class_1.java 
     class_2.java 
    bar 
     class_3.java 
     class_4.java 

您可以使用Ant所有源文件複製到一個臨時目錄,編譯和打包,然後在一個.jar,但正如我所說,你會遇到一些問題,比如名字變形(例如:你可以在不同的直接變量中使用相同的名字)。你的所有類必須有不同的名稱,並且所有的類都必須相互訪問,因爲它們在同一個包中。所有這些問題都與我提出的解決方案有關。當然,您可以修改複製到臨時目錄的文件的代碼,但我真的不認爲這一切都值得嘗試......我真誠地建議您按照「開發的方式」在Java,使用一些IDE,遵循Java Code Conventions等。

0

這是毫無意義的。這裏很難找到問題。
但我會盡量回答:

  1. Java要求你的文件是嚴格組織 acordingly它的類名。
    想想Python,其中強制執行縮進。它這樣做是爲了消除中的需要
    與縮進相關的編碼約定。
  2. 它這樣做是爲了你自己好,以防止類型的情況:

    如何找到這個類在這樣一個大的項目?
    原來我正在寫一個已經存在的類/功能。
    對於這個項目,如何我應該組織這些文件?有一些約定嗎?
    什麼?!在單個文件中定義了100個類?

  3. 不喜歡與文件和目錄結構手動工作?
    使用IDE,它會爲你做到這一點。

  4. 如果你仍然想要Java的靈活性,爲什麼不嘗試一些基於Java的語言?例如
    像Groovy一樣。或者Clojure,或者Scala,或者...
    它們都在JVM中工作,它們的語法與Java兼容,但更多寬鬆寬容。 這同樣適用於目錄結構。 獎勵!您可以將Groovy腳本與Java類混合使用。

底部注:其實,非公共類並不需要遵守這個約定
如果您決定宣佈你的類之一,包訪問
不會從你的包外部訪問,但你可以給你想要的名稱一些奇怪的原因。

0

你不嚴格.java文件整理到該包相匹配的目錄結構 - .class文件必須在這樣一個結構,但javac將接受一個平面結構爲.java文件 - 但是你會做你如果你這麼做的話,生活就會容易得多,因爲世界上所有的高級Java工具都希望你遵循這個約定。例如,Ant依賴於.java.class目錄結構之間的匹配,以便能夠確定哪些.class文件相對於其對應的.java已過期。如果結構不匹配,則每次都會重新編譯每個.java文件。

但是每個.java文件的名稱必須匹配它定義了public class的名稱(你可以有幾個班,一個.java文件,但它們中的大多數人可以public,其名稱必須與文件名匹配) 。這是編譯器的一個要求,不值得與之對抗。

+0

真的嗎?我認爲'.java'和'。類路徑名_必須與類名相匹配。從來沒有在我的生活中,我可以有一個公開課在錯誤的文件中聲明。我的編譯器不允許我這樣做。 –

+0

我懷疑所有的IDE都會強制執行源文件的包結構,但這在技術上並不是編譯器的要求。嘗試用包聲明創建一個簡單的'Hello.java',然後執行'javac -d。 Hello.java' - 它會起作用,並把'Hello.class'文件放在一個包的子目錄中。 –

+0

只要這些課程沒有公開,這不是一個要求。**但是大多數課程都是。 –

相關問題