2012-12-03 65 views
6

Tôi có một ứng dụng bảng điều khiển Java mà tôi đã sẵn sàng triển khai trên một máy chủ Unix. Tôi đang viết một kịch bản lệnh shell để chạy ứng dụng.Cấu trúc thư mục triển khai tốt cho các ứng dụng giao diện điều khiển java

Tôi định đặt kịch bản shell vào một thư mục, jar ứng dụng và các lọ phụ thuộc (mùa xuân, v.v.) vào một thư mục và tệp thuộc tính khác (những tệp cần được duy trì 'sống') trong một thư mục riêng biệt . Sau đó tôi sẽ có kịch bản shell của tôi lặp qua các tệp trong thư mục 'jars' và 'properties', thêm chúng vào classpath, trước khi cuối cùng gọi java ...

Đây có phải là cấu trúc triển khai 'tốt' không? Có bất kỳ hướng dẫn nào về cách sắp xếp tệp để tối đa hóa khả năng bảo trì và tính ổn định không? Có cách nào rõ ràng 'sai' để làm điều này tốt nhất nên tránh?

Tôi nên thêm điều đó, cho một dự án trước, tôi đặt tất cả các kịch bản lệnh shell (bắt đầu quá trình java và các tập lệnh không) vào thư mục tập lệnh, ứng dụng của tôi được đưa vào thư mục với các thư viện trong thư viện thư mục con và tài nguyên bên ngoài vào một thư mục con config. Sau đó tôi đã viết một tập lệnh tải tất cả các tệp một cách rõ ràng. Nó được tạo ra từ lâu để viết và cần được duy trì bất cứ khi nào tôi nâng cấp một thư viện jar. Lần này tôi muốn làm tốt hơn. Ngoài ra, nó cảm thấy không cần thiết để tách JAR ứng dụng của tôi khỏi các thư viện.

+1

Sử dụng Maven cho việc này. – djechlin

+1

Maven có thể tạo tệp kê khai cho tệp jar của bạn với tham chiếu đến các thư viện của bạn, sau đó java sẽ tự tìm thấy các tệp đó. Cũng phụ thuộc vào cách bạn "nhìn" cho các tập tin thuộc tính bạn có thể lấy đi với một mục nhập classpath duy nhất cho những người.Công việc viết kịch bản lệnh shell sau đó sẽ giảm đi nhiều. – Konstantin

+0

Cảm ơn. Tôi sẽ điều tra bằng cách sử dụng maven-jar-pluging để giảm bớt khối lượng công việc của tôi. Tôi đã quên rằng các tệp kê khai có thể làm điều này. –

Trả lời

2

Đối với những gì nó đáng giá, đây là những gì chúng tôi sử dụng;

/ 
    /class 
     //package hierarchy here, raw .class files 
    /lib 
     //library jars here, apache commons, gson etc, all .jars 
    /conf 
     //.properties files go here, including ones for libraries 
    /doc 
     //program documentation files, typically .txt 
     /javadocs 
      //java doc html root 
    /sh 
     //shell scripts including execute.sh and compile.sh 

Chúng tôi sử dụng ant để xây dựng, thường có thư mục src cho cây nguồn nếu cần. Bằng cách này, bạn chỉ cần thêm /class/lib vào đường dẫn lớp của mình và điều đó không bao giờ thay đổi.

+0

Đây là những gì tôi có trong tâm trí. Tôi đoán nó là tốt để thấy rằng nó được sử dụng ở nơi khác. –

1

Cấu trúc tốt cho trường hợp của bạn được gọi là uberJar hoặc oneJar, có thể được thực hiện với số lượng utils, chỉ cần google nó. Ngoài ra, tôi có thể đề xuất một đoạn mã đẹp như http://www.jdotsoft.com/JarClassLoader.php

+0

Tôi có thể thấy làm thế nào mà sẽ làm cho classpaths và triển khai dễ dàng hơn. Mối quan tâm của tôi là nó ẩn các thư viện thực tế được sử dụng trong triển khai. Trong khi về mặt lý thuyết có thể xác định phiên bản nào của các lọ được đóng gói trong uberjar, tôi có thể thấy người duy trì trung bình có nguyên nhân đáng lo ngại. –

+0

kiểm tra JarClassloader, nó cho phép lọ lồng nhau. – xeye

1

Thành thật mà nói, nếu nó chỉ là một ứng dụng nhỏ, tôi sẽ đặt tất cả dưới /opt/<my_java_app> và có một cấu trúc con thư mục ở đó giống như bạn đã làm trong dev.

Nếu bạn muốn trở thành phù hợp hơn với UNIX khuyến nghị thực hành, sau đó đặt thực thi của bạn (bao gồm cả jar của bạn) trong /usr/local/bin/<my_java_app>, file config trong /etc/<my_java_app>, log file và file dữ liệu khác trong /var/<my_java_app>.

Ngoài ra, bạn có thể tham khảo this document.

0

Tạo gói hệ thống riêng và sử dụng giá trị mặc định của hệ thống. Nếu sử dụng Debian, hãy tạo .deb trực tiếp từ hệ thống xây dựng của bạn (ví dụ: sử dụng ant deb task). Nếu sử dụng RPM, hãy sử dụng rpm task. Bằng cách đó bạn có thể dễ dàng triển khai, hủy triển khai và cập nhật ứng dụng giống như bất kỳ ứng dụng nào khác.

Gói hệ thống nên tách các thư viện (tôi sử dụng /usr/share/java/AppName cho các lọ của tôi) và cấu hình (để /etc/AppName hoặc /home/UserName/.AppName); liên kết khởi chạy-tập lệnh I đến /usr/bin. Ngoài ra, không có biến chứng lớn nào khiến mọi thứ trở nên hiệu quả. Tôi khuyên bạn nên tìm các gói dựa trên java nổi tiếng trong bản phân phối của bạn và sao chép các kịch bản lệnh khởi chạy của chúng (đặc biệt là ma thuật định vị VM).

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