2012-01-30 34 views
7

Tôi có một ứng dụng máy chủ và hai ứng dụng khách dựa trên Swing. Chúng tôi đang phát triển chúng trong nhật thực và có một dự án riêng biệt cho mỗi.Tạo các lớp học trong cùng một gói vào các lọ riêng biệt

Nhiều lớp học được chia sẻ. Ví dụ: gói my.server có một số lớp cho cả máy chủ và máy khách trong khi các lớp khác chỉ dành cho máy chủ. Mặc dù tôi thích đặt chúng trong cùng một gói vì chúng có liên quan chặt chẽ và một số chúng dựa vào khả năng hiển thị gói, tôi không muốn phân phối các lớp mà một ứng dụng không cần không chỉ làm kích thước tệp, mà còn nó sẽ là một nguy cơ bảo mật.

Hiện tại, mỗi máy chủ và máy khách đều có cùng một lọ, đó là một mớ hỗn độn. Lý tưởng nhất, tôi muốn tự động tạo ra các lọ dựa trên sự phụ thuộc như sau.

Server:

  • server.jar: lớp học được sử dụng bởi máy chủ chỉ
  • server-client1-common.jar: lớp học được chia sẻ bởi Server và Client 1
  • server-client2-common.jar: các lớp học được chia sẻ bởi server và Client 2

khách hàng 1:

  • client1.jar: lớp học được sử dụng bởi khách hàng 1 chỉ
  • server-client1-common.jar: lớp học được chia sẻ bởi Server và Client 1
  • client-common.jar: lớp học được chia sẻ bởi khách hàng 1 và Client 2, nhưng không phải máy chủ

khách hàng 2:

  • client2.jar: lớp học được sử dụng bởi khách hàng 2 chỉ
  • server-client2-common.jar: lớp học được chia sẻ bởi Server và Client 2
  • client-common.jar: các lớp được chia sẻ bởi Máy khách 1 và Máy khách 2, nhưng không phải Máy chủ

Tôi nhận ra rằng bạn có thể thực hiện việc này theo cách thủ công, nhưng đó sẽ là một thảm họa bảo trì. Có một công cụ tự động xử lý sự phụ thuộc như vậy không?

+1

Nếu bạn đang sử dụng 'maven' cho quá trình xây dựng, hãy kiểm tra cuộc thảo luận này: http://stackoverflow.com/questions/2424015/maven-best-practice- cho-tạo-nhiều-jars-với-khác nhau-lọc-lớp học – bchetty

Trả lời

1

Một trong những phương pháp hay nhất về ứng dụng xây dựng là có một bình cho mỗi dự án. Ví dụ:
Maven, sử dụng giá trị này làm mặc định. Bạn có thể lừa nó để làm khác, nhưng nó là tốt hơn để tham gia cùng họ thay vì "chiến đấu" chúng.

http://maven.apache.org/guides/mini/guide-using-one-source-directory.html
http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

Vì vậy, trong trường hợp của bạn, bạn nên tạo 6 dự án: Server, trạm Client1, Client2, ServerClient1Common, ServerClient2Common, ClientCommon

Để chọn các lớp cần thiết, tôi không nghĩ rằng có một công cụ, và có lẽ bạn nên biết tốt hơn chức năng phổ biến là gì. Tạo các dự án phổ biến và thêm chúng vào đường dẫn xây dựng - phụ thuộc. Sau đó bắt đầu di chuyển các lớp của bạn vào dự án chung, để chúng trong cùng một gói.

Ví dụ: tạo dự án ServerClient1Common.
Đối với Client1, hãy vào Configure Build Path -> Projects. Thêm ServerClient1Common. Xóa tất cả các tham chiếu đến Dự án máy chủ.
Đối với Máy chủ, hãy vào Configure Build Path -> Projects. Thêm ServerClient1Common. Xóa tất cả các tham chiếu đến Dự án Client1.

Bây giờ bạn sẽ có rất nhiều lớp/nhập bị thiếu. Cố gắng giải quyết từng cái một.

Cuối cùng, bạn sẽ có thể biên dịch 3 dự án và lấy các lọ bạn đã đề cập.

PS: Các chiến lược khác (như một dự án khác với các mục tiêu xây dựng khác nhau hoặc 3 dự án với các nhà xây dựng kiến ​​/ quạ bị quấy rối) là lộn xộn hơn. Có thể có một ngoại lệ - một cách khác để tách các lớp, nhưng tôi không biết liệu nó có áp dụng cho bạn hay không: client1.jar, client1-interface.jar, client2.jar, client2-interface.jar, server.jar, server- interface.jar.Bằng cách này bạn có thể sử dụng 3 dự án với mỗi dự án có hai lọ mục tiêu. Để chạy client2.jar, bạn sẽ cần server-interface.jar

3

Bạn có ý nghĩa gì với "thảm họa bảo trì"? Nếu bạn tạo một kịch bản ANT, chỉ cần chạy nó và nó sẽ biên dịch và đóng gói các lọ cho bạn.

Là giải pháp thay thế mạnh mẽ hơn, bạn có thể sử dụng maven. Đối với một cái gì đó nhẹ hơn, công cụ xuất nhật thực có sẵn có thể hoạt động.

+0

Bởi bảo trì thảm họa, bạn sẽ không cần phải cập nhật kịch bản kiến ​​mỗi khi bạn tạo một lớp học hoặc giao diện? –

+1

Có lẽ bạn nên tạo ít nhất ba gói riêng biệt - 'server',' client' và 'shared' và chỉ cần thêm chúng vào tập lệnh. – Marcelo

+0

Đó là vấn đề tôi đang gặp phải - trong cùng một gói, một số lớp dựa vào khả năng hiển thị gói, một số được chia sẻ và một số khác không được chia sẻ. –

3

Tôi không thể giới thiệu cho bạn giải pháp sẵn sàng để tiếp cận. Dưới đây là một ý tưởng mặc dù: tạo chú thích hoặc một tập các chú thích như thế này:

@jarselector(types='server') 
class ServerOnly { 
    ... 
} 

@jarselector(types='server,client1') 
class ServerAndClient { 
    ... 
} 

Sau đó tạo nhiệm vụ kiến ​​của riêng bạn bằng cách mở rộng nhiệm vụ jar (hoặc plugin maven) hoặc viết nhiệm vụ của riêng bạn, mà sẽ đưa chú thích này và gói các lớp theo chú thích, sau đó bạn sẽ sử dụng như một bộ lọc.

Bạn sẽ chỉ phải tạo tác vụ một lần - tôi đã thực hiện tác vụ này trong quá khứ, điều này ít phức tạp hơn âm thanh và sự cố âm thanh đủ lớn để đảm bảo nỗ lực.

Sau đó bạn phải chú thích tất cả các lớp của bạn một lần (hoặc tùy thuộc vào việc triển khai của bạn chỉ những lớp mà khách hàng cần, hoặc chỉ những lớp không được chia sẻ bởi mỗi bình v.v.). Bất cứ ai nhìn thấy một lớp học có thể thấy ngay lập tức những gì nó được sử dụng cho. Khi tạo một lớp mới, bạn có thể dễ dàng thêm chú thích.

Tôi thực sự không nghĩ rằng có một tác vụ kiến ​​tạo sẵn hoặc plugin maven thực hiện việc này.

Cách khác - nếu bạn thực sự không thể thay đổi cấu trúc gói của mình - bạn cũng có thể sử dụng nhiều thư mục nguồn để giữ gói nhưng tách tệp trong các thư mục khác nhau. Eclipse không quan tâm bạn sử dụng bao nhiêu thư mục nguồn. Sau đó, bạn sẽ cần phải điều chỉnh công cụ xây dựng của mình chỉ một lần cho các thư mục nguồn và sau đó có thể sắp xếp các tệp theo cách đó.

1

Có một dự án Eclipse riêng biệt cho mỗi JAR mà bạn sắp tạo. Sau đó, thiết lập các phụ thuộc trên tab "Dự án" của Đường dẫn xây dựng, cho từng dự án cấp cao nhất. Vì vậy, dự án "máy chủ" sẽ có "server-client1-common" và "server-client2-common" được liệt kê là các dự án bắt buộc. Và cứ thế.

Tôi đã thấy mô hình này được sử dụng bởi một số tổ chức khác nhau và tôi luôn nghĩ rằng đây là cách "được chấp nhận bởi ngành". Nó chỉ hoạt động!

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