2009-10-02 161 views
23

我來自C#/ Visual Studio背景下的Java和Eclipse。在後者中,我通常會組織一個解決方案,像這樣:Eclipse Java項目文件夾組織

\ MyProjects下\ MyApp的\ MyAppsUtilities \ LowerLevelStuff

MyApp的地方將包含一個項目,建立一個.exe文件,MyAppsUtilities將使稱爲彙編DLL通過.exe和LowerLevelStuff可能會構建一個包含更高級別實用程序DLL使用的類的程序集。

在Eclipse(Ganymede中,但可以確信切換到伽利略)我有:

\ MyProjects下\工作區\ MyApp的

當我創建我最初的項目。有一個選項可以將源文件和生成文件放在同一個文件夾中,但是我的路徑上創建了.java文件,這反映了我的包層次結構:

\ MyProjects \ workspace \ MyApp \ src \ com \ mycompany \ MYAPP \ MyApp.java

我的問題是這樣的:當我創建子項目(?是正確的Java/Eclipse的術語)的.jar文件,這將是類似於在.NET上述MyAppsUtilities和LowerLevelStuff集DLL,可以(應該)我是否等同地組織文件夾?例如:

\ MyProjects下\工作區\ MyApp的\ SRC \ COM \ myCompany的\ MYAPP \ myapputilities \ MyAppsUtilities.java

什麼是組織這個東西的標準/正確的方法,以及它是如何比較特別做在IDE中?

回答

50

將Java源代碼包視爲一個大的分層名稱空間。商業應用通常位於'com.mycompany.myapp'(該應用的網站可能是'http://myapp.mycompany.com',儘管這顯然不總是這種情況)。

如何組織你的myapp包下的東西很大程度上取決於你。您在可執行文件(.exe),DLL和低級類之間爲C#所做的區別在Java中不以相同的形式存在。所有Java源代碼都被編譯到.class文件中(其內容稱爲「字節碼」),這些文件可以在許多平臺上由Java虛擬機(JVM)執行。所以在高級/低級別課程中沒有固有的區別,除非您通過包裝來確定這些級別。常見的包裝方式是:

  • com.mycompany.myapp:main class; MyApp(帶主要方法)
  • com.mycompany.myapp.model:域模型類;客戶,訂單等
  • com.mycompany.myapp.ui:用戶界面(演示文稿或視圖)代碼
  • com.mycompany.myapp.service:您的應用程序內的服務,即 '商業邏輯'
  • 融爲一體。 mycompany.myapp.util:在幾個地方

這表明一個獨立的Java應用程序中使用的輔助類,如果是使用許多框架的一個web應用程序可能會有所不同。

這些軟件包對應於項目中的目錄層次結構。在使用Eclipse時,這種層次結構的根稱爲「源目錄」。項目可以定義多個源目錄,通常是「主」和「測試」源目錄。

在項目文件的例子:

src/test/java/com/acme/foo/BarTest.java 
src/main/java/com/acme/foo/Bar.java 
lib/utilities_1_0.jar 

而且裏面utilities_1_0.jar:

com/acme/foo/BarUtils.class 

BarUtils.class這是編譯的Java類,所以在平臺獨立的字節碼的形式,可以是在任何JVM上運行。通常,jarfiles只包含已編譯的類,儘管有時可以下載也包含源(.java)文件的jar版本。如果您想要讀取正在使用的jar文件的原始源代碼,這非常有用。

在上面的例子中,BarTest和BarUtils都在同一個包com.acme.foo中,但物理上駐留在硬盤上的不同位置。

直接駐留在源目錄中的類位於「默認包」中,因此,在類中保留類通常不是一個好主意,因爲不清楚該類屬於哪個公司和應用程序,並且可以獲取名稱衝突如果添加到類路徑中的任何jar文件在默認包中包含一個具有相同名稱的類。

現在,如果您部署此應用程序,它通常會編譯到.class文件中並捆綁在一個.jar文件中(這基本上是一個.zip文件的奇特名稱以及一些清單信息)。 製作.jar文件不是運行應用程序所必需的,但在部署/分發應用程序時很方便。使用清單信息,您可以創建一個.jar文件'可執行文件',以便用戶可以輕鬆運行它,參見[a]。

通常情況下,您還將使用多個庫,即從Internet獲得的現有.jar文件。很常見的例子是用於訪問數據庫的log4j(一個日誌框架)或JDBC庫。另外你可能有自己的子模塊,它們被部署在不同的jar文件中(如上面的'utilities_1_0.jar')。如何通過jar文件拆分是部署/分發問題,它們仍然共享Java源代碼的通用名稱空間。所以實際上,如果你想(但你通常不),你可以解壓所有的jar文件並把內容放在一個大的目錄結構中。

運行使用/由多個庫組成的Java應用程序時,會遇到通常稱爲「Classpath hell」的情況。我們知道Java的最大缺點之一。 (注意:幫助應該是on the way)。要在命令行(即不是從Eclipse)運行Java應用程序,必須在類路徑中指定每個.jar文件位置。當你使用Java的許多框架(Maven,Spring,OSGi,Gradle)時,通常需要某種形式的支持來緩解這種痛苦。如果你正在構建一個web應用程序,你通常只需要遵循其分層/部署約定,以便能夠輕鬆地在你選擇的Web容器(Tomcat,Jetty,Glassfish)中部署這個東西。

我希望這給了一些關於Java中的事情如何工作的一般洞察力!

[a]要創建MyApp應用程序的可執行jar,您需要在路徑上使用JDK。然後使用下面的命令行中的編譯(BIN或目標)目錄:

java -jar myapp.jar 

或通過雙擊的jar文件:

jar cvfe myapp.jar com.mycompany.myapp.MyApp com\mycompany\myapp 

然後,您可以在命令行中與執行它。請注意,在這種情況下,您將看不到Java控制檯,所以這僅適用於擁有自己的GUI(如Swing應用程序)或可能在後臺運行的應用程序(如套接字服務器)。

+1

因此,您所說的所有內容都是有道理的,但僅當我使用層級化的文件夾像這樣: com \ mydomain \ myapp \ util 然後添加一個聲明的源文件: package com.mydomain.myapp.util;然後Eclipse在util文件夾下建立一大堆新文件夾: com \ mydomain \ myapp \ util \ com \ mydomain \ myapp \ util \ src \ myclass.java – 2013-02-21 03:17:13

+4

您正在將軟件包層次結構與Eclipse源文件夾混淆。 Eclipse源文件夾應該是'src/main/java /'(如果你遵循Maven約定)。這只是您的包層次結構的起點;文件夾'src/main/java'將指向默認包。在這個文件夾下,Eclipse將生成文件夾以匹配包,因此您的示例類將最終位於/src/main/java/com/mydomain/myapp/util/myclass.java – 2013-02-24 10:35:09

+0

GitHub上是否有此項文件夾結構的Java項目一個真實世界的例子? – 2017-10-11 13:39:44

1

通常,您將在Eclipse中創建相關/子項目作爲不同的項目。

+0

那麼,這是一個扁平的組織,就像下面這樣? [1] \ MyProjects \ workspace \ MyApp [2] \ MyProjects \ workspace \ MyAppsUtilities [3] \ MyProjects \ workspace \ LowerLevelStuff – Buggieboy 2009-10-02 15:42:23

7

Maven有一個深思熟慮的standard directory layout。即使你沒有直接使用Maven,你也可以將其視爲事實標準。 Maven的「多模塊」項目與您所描述的.net多個組件佈局相當類比。

2

有需要澄清這個問題可以回答前兩件事情:

  1. 將使用哪種源代碼庫?
  2. 您將使用哪種構建系統在Eclipse之外自動構建工件?

答案將強烈影響您的選擇。

我們選擇了「一個Eclipse項目pr組件」,它可能是一個庫或完成的可運行/可執行的jar。這使得哈德森自動化很容易。我們使用CVS也比較容易,因爲單個項目沒有多重責任。

請注意,每個項目可能包含多個源文件夾,例如,從Java源代碼配置測試代碼。這與簡化結構並不重要。