2009-10-02 41 views
23

Tôi đang đến với Java và Eclipse từ nền C#/Visual Studio. Trong trường hợp sau, tôi sẽ thường tổ chức một giải pháp như vậy:Tổ chức thư mục dự án Eclipse Java

\ MyProjects \ MyApp \ MyAppsUtilities \ LowerLevelStuff

nơi MyApp sẽ chứa một dự án để xây dựng một .exe, MyAppsUtilities sẽ làm cho một DLL lắp ráp gọi bởi .exe, và LowerLevelStuff có lẽ sẽ xây dựng một assembly có chứa các lớp được sử dụng bởi các tiện ích cao cấp DLL.

Trong Eclipse (Ganymede, nhưng có thể được thuyết phục để chuyển sang Galileo) Tôi có:

\ MyProjects \ workspace \ MyApp

Khi tôi tạo ra dự án ban đầu của tôi. Có một tùy chọn để đặt nguồn và tạo tệp trong cùng một thư mục, nhưng tôi có tệp .java được tạo trên đường dẫn phản ánh phân cấp gói của tôi:

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

Câu hỏi của tôi là: khi tôi tạo các tiểu dự án (là đúng thuật ngữ Java/Eclipse?) cho các tệp .jar tương tự với các tệp MyAppsUtilities và LowerLevelStuff lắp ráp trong .NET, có thể (nên) tôi tổ chức các thư mục tương đương? Ví dụ:

\ MyProjects \ workspace \ MyApp \ src \ com \ mycompany \ myapp \ myapputilities \ MyAppsUtilities.java

tiêu chuẩn chiều/quyền tổ chức công cụ này là gì, và làm thế nào là nó specifcally thực hiện trong IDE?

Trả lời

50

Hãy nghĩ đến các gói mã nguồn Java là một không gian tên phân cấp lớn. Các ứng dụng thương mại thường sống dưới 'com.mycompany.myapp' (trang web cho ứng dụng này có thể là 'http://myapp.mycompany.com' mặc dù điều này rõ ràng không phải luôn luôn như vậy).

Cách bạn sắp xếp nội dung trong gói myapp của mình phần lớn phụ thuộc vào bạn. Sự khác biệt mà bạn tạo ra cho C# giữa các tệp thực thi (.exe), các lớp DLL và cấp thấp không tồn tại trong cùng một dạng trong Java. Tất cả các mã nguồn Java được biên dịch thành các tệp .class (nội dung được gọi là 'bytecode') có thể được thực thi bởi Máy ảo Java (JVM) trên nhiều nền tảng. Vì vậy, không có sự phân biệt cố hữu trong các lớp cấp cao/cấp thấp, trừ khi bạn phân bổ các cấp độ như vậy thông qua bao bì của bạn. Một cách phổ biến của bao bì là:

  • com.mycompany.myapp: class chính; MyApp (với phương thức chính)
  • com.mycompany.myapp.model: các lớp mô hình miền; Khách hàng, Đơn đặt hàng, v.v.
  • com.mycompany.myapp.ui: giao diện người dùng (trình bày hoặc xem) mã
  • com.mycompany.myapp.service: dịch vụ trong phạm vi ứng dụng của bạn, tức là 'logic kinh doanh'
  • com. mycompany.myapp.util: các lớp trợ giúp được sử dụng ở một số địa điểm

điều này cho thấy một ứng dụng Java độc lập, nó có thể khác nếu nó là một ứng dụng web sử dụng một trong nhiều khung công tác.

Các gói này tương ứng với hệ thống phân cấp thư mục trong dự án của bạn. Khi sử dụng Eclipse, gốc của hệ thống phân cấp như vậy được gọi là 'thư mục nguồn'. Một dự án có thể định nghĩa nhiều thư mục nguồn, thường là thư mục nguồn 'chính' và 'kiểm tra'.

Ví dụ về tập tin trong dự án của bạn:

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

Và bên utilities_1_0.jar:

com/acme/foo/BarUtils.class 

BarUtils.class đây là một lớp java biên soạn, vì vậy trong nền tảng dạng bytecode độc ​​lập có thể được chạy trên bất kỳ JVM nào. Thông thường các jarfiles chỉ chứa các lớp được biên dịch mặc dù đôi khi bạn có thể tải xuống một phiên bản của jar cũng chứa các tệp nguồn (.java). Điều này rất hữu ích nếu bạn muốn có thể đọc mã nguồn gốc của tệp jar bạn đang sử dụng.

Trong ví dụ trên Bar, BarTest và BarUtils là tất cả trong cùng một gói com.acme.foo nhưng vật lý cư trú ở các vị trí khác nhau trên đĩa cứng của bạn.

Các lớp cư trú trực tiếp trong thư mục nguồn nằm trong 'gói mặc định', bạn không nên giữ lớp ở đó vì không rõ công ty và ứng dụng thuộc lớp nào và bạn có thể nhận được xung đột tên nếu bất kỳ tệp jar nào bạn thêm vào classpath của bạn đều chứa một lớp có cùng tên trong gói mặc định.

Bây giờ nếu bạn triển khai ứng dụng này, nó thường được biên dịch thành các tệp .class và đi kèm trong .jar (về cơ bản là tên ưa thích cho tệp .zip cộng với một số thông tin biểu hiện). Tạo một .jar là không cần thiết để chạy ứng dụng, nhưng tiện dụng khi triển khai/phân phối ứng dụng của bạn. Sử dụng thông tin tệp kê khai, bạn có thể tạo tệp .jar 'có thể thực thi' để người dùng có thể dễ dàng chạy tệp, xem [a].

Thông thường bạn cũng sẽ sử dụng một số thư viện, tức là các tệp .jar hiện có mà bạn thu được từ Internet. Ví dụ rất phổ biến là log4j (một khung ghi nhật ký) hoặc các thư viện JDBC để truy cập cơ sở dữ liệu vv. Ngoài ra, bạn có thể có các mô-đun con của riêng bạn được triển khai trong các jarfiles riêng biệt (như 'tiện ích_1_0.jar' ở trên). Làm thế nào mọi thứ được phân chia trên các jarfiles là một vấn đề triển khai/phân phối, chúng vẫn chia sẻ không gian tên chung cho mã nguồn Java. Vì vậy, trong thực tế, bạn có thể giải nén tất cả các jarfiles và đặt các nội dung trong một cấu trúc thư mục lớn nếu bạn muốn (nhưng bạn thường không).

Khi chạy một ứng dụng Java sử dụng/bao gồm nhiều thư viện, bạn chạy vào những gì thường được gọi là 'Classpath hell'. Một trong những hạn chế lớn nhất của Java như chúng ta biết. (lưu ý: trợ giúp được cho là on the way). Để chạy một ứng dụng Java trên dòng lệnh (tức là không phải từ Eclipse), bạn phải chỉ định từng vị trí tệp .jar duy nhất trên đường dẫn lớp. Khi bạn đang sử dụng một trong nhiều khung công tác của Java (Maven, Spring, OSGi, Gradle), thường có một số hình thức hỗ trợ để giảm bớt nỗi đau này.Nếu bạn đang xây dựng một ứng dụng web, thông thường bạn sẽ phải tuân thủ các quy ước phân tầng/triển khai của nó để có thể dễ dàng triển khai điều trong vùng chứa web bạn chọn (Tomcat, Jetty, Glassfish).

Tôi hy vọng điều này sẽ cung cấp một số thông tin chi tiết chung về cách mọi thứ hoạt động trong Java!

[a] Để tạo một jar thực thi của ứng dụng MyApp, bạn cần một JDK trên đường dẫn của bạn. Sau đó sử dụng dòng lệnh sau đây trong biên dịch của bạn (bin hay mục tiêu) thư mục:

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

Sau đó bạn có thể thực hiện nó từ dòng lệnh với:

java -jar myapp.jar 

hoặc bằng cách nhấp đúp vào file jar. Lưu ý rằng bạn sẽ không thấy giao diện điều khiển Java trong trường hợp đó vì vậy điều này chỉ hữu ích cho các ứng dụng có GUI riêng của chúng (như một ứng dụng Swing) hoặc có thể chạy trong nền (giống như một máy chủ socket).

+1

vì vậy, tất cả những gì bạn nói có ý nghĩa, nhưng chỉ khi tôi nhận được Eclipse được cấu hình với một hệ thống phân cấp các thư mục như sau: com \ mydomain \ myapp \ util sau đó thêm tệp nguồn có khai báo: gói com.mydomain.myapp.util; sau đó Eclipse xây dựng toàn bộ một loạt các thư mục mới trong thư mục util: com \ mydomain \ myapp \ util \ com \ mydomain \ myapp \ util \ src \ myclass.java –

+4

Bạn đang bối rối với hệ thống phân cấp gói của bạn với thư mục nguồn Eclipse. Thư mục nguồn Eclipse phải giống như 'src/main/java /' (nếu bạn làm theo các quy ước Maven). Đây chỉ đơn giản là điểm khởi đầu cho hệ thống phân cấp gói của bạn; thư mục 'src/main/java' sẽ trỏ tới gói mặc định. Trong thư mục này Eclipse sẽ tạo các thư mục để phù hợp với các gói, vì vậy lớp ví dụ của bạn sẽ kết thúc bằng /src/main/java/com/mydomain/myapp/util/myclass.java –

+0

Có một dự án Java trên GitHub với cấu trúc thư mục này cho một ví dụ thực tế? –

1

Thông thường bạn sẽ tạo các dự án liên quan/phụ dưới dạng các Dự án khác nhau trong Eclipse.

+0

Vì vậy, đó là một tổ chức phẳng, như sau? [1] \ MyProjects \ workspace \ MyApp [2] \ MyProjects \ workspace \ MyAppsUtilities [3] \ MyProjects \ workspace \ LowerLevelStuff – Buggieboy

7

Maven cũng đã suy nghĩ rõ ràng standard directory layout. Ngay cả khi bạn không sử dụng nó trực tiếp Maven, bạn có thể nghĩ đây là một tiêu chuẩn defacto. Maven "đa mô-đun" dự án là một tương tự công bằng để bố trí lắp ráp nhiều .net mà bạn mô tả.

2

Có hai điều bạn cần phải làm rõ trước khi câu hỏi này có thể được giải đáp:

  1. Những kho mã nguồn mà bạn sẽ sử dụng không?
  2. Bạn sẽ sử dụng hệ thống xây dựng nào để tự động tạo các tạo tác bên ngoài Eclipse?

Câu trả lời sẽ ảnh hưởng mạnh mẽ đến các tùy chọn của bạn.

Chúng tôi đã chọn tham gia "một thành phần dự án Eclipse pr" có thể là thư viện hoặc bình chứa có thể chạy/chạy được. Điều này đã làm cho nó dễ dàng để tự động hóa với Hudson. Việc sử dụng CVS của chúng tôi cũng dễ dàng hơn vì các dự án đơn lẻ không có nhiều trách nhiệm.

Lưu ý, mỗi dự án có thể chứa một số thư mục nguồn tách ví dụ: kiểm tra mã từ cấu hình từ nguồn Java. Điều đó không quan trọng bằng việc đơn giản hóa cấu trúc của bạn.

Các vấn đề liên quan