2010-11-10 37 views
7

Làm cách nào để xác định xem một số mã (một serv-let hoặc một lớp đơn giản) đang chạy trên Google App Engine (Java) để người dùng có thể quyết định để sử dụng thư viện cụ thể của công cụ ứng dụng hay không? Có một số môi trường thời gian chạy đáng tin cậy ID cho điều đó?xác định xem mã có đang chạy trên thời gian chạy của ứng dụng (Java)

+0

có thể trùng lặp của [Làm thế nào để kiểm tra trong Java App Engine nếu chúng ta trên máy trạm phát triển] (http://stackoverflow.com/ câu hỏi/1574637/how-to-check-in-java-app-engine-nếu-chúng tôi-đang-trên-phát triển-máy trạm) –

Trả lời

4

Bạn có thể kiểm tra com.google.appengine.runtime.version tài sản:

String appEngineVersion = System.getProperty("com.google.appengine.runtime.version"); 

Nếu nó được thiết lập, nó App Engine.

Nhưng tôi sẽ xem xét sử dụng các mục tiêu xây dựng riêng biệt thay vào đó, để tránh chi phí thời gian chạy.

+1

Cảm ơn rất nhiều cho câu trả lời. Tôi có 2 lớp con thực hiện riêng biệt cho 2 trường hợp và chúng khá nhỏ (200 dòng trong kích thước mã trong tổng số của cả hai) cần xây dựng riêng biệt, tôi giả sử. – nsegae

1

Như @Matthew Flaschen đã nói, có các thuộc tính hệ thống mà bạn có thể kiểm tra để xác định xem GAE có hiện diện hay không. This link cung cấp chi tiết.

Nếu bạn đi xuống tuyến đường này, ứng dụng của bạn cần phải được xây dựng để mã chính không phụ thuộc tĩnh vào các lớp GAE; nghĩa là không nhập hoặc tham chiếu khác tới các gói và lớp GAE trong mã (các tên lớp GAE riêng lẻ, vv trong các chuỗi ký tự String). Tất cả các phụ thuộc phải được tách biệt với mã được tải bằng cách sử dụng Class.forName(String) SAU KHI bạn đã xác định GAE có hiện diện hay không.

này đại diện cho một chi phí không tầm thường:

  • Bạn có lẽ sẽ kết thúc với một giao diện Adaptor thêm và (ít nhất) hai triển khai cho các trường hợp GAE và phi GAME.
  • Bạn có các chi phí thời gian chạy (nhỏ) của việc tải động lớp học có liên quan khi khởi động và gọi qua giao diện Bộ điều hợp.
  • Tệp JAR của bạn lớn hơn nhiều.
  • Bây giờ bạn phải thử nghiệm trên hai nền tảng.

Mặt khác, bạn có lợi thế tiềm năng khi có một JAR hoạt động trong cả ngữ cảnh GAE và không phải GAE.

0

Có một cách khác để thực hiện việc này. Này được giải thích trong tài liệu hướng dẫn gaevfs về làm thế nào để viết di động Mã: http://code.google.com/p/gaevfs/wiki/ApplicationPortability

quan tâm đến bạn là dòng sau:

boolean isGoogleAppEngine = getServletContext().getServerInfo().contains("Google"); 
1

Như đã giải thích here bạn có thể kiểm tra các tài sản sau đây:

String environment = System.getProperty(
    "com.google.appengine.runtime.environment") 

environment là "Sản xuất" khi chạy trên App Engine và "Phát triển" khi chạy trong máy chủ phát triển.

2

tương tự như những gì @Reza viết, nhưng một chút bụi:

sử dụng SystemProperty.environment.value() để có được "Sản" khi chạy trên App Engine, và "Phát triển" khi chạy trong máy chủ phát triển.

1

tôi thấy không có giải pháp kiểu an ở đây để ở đây là:

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) { 
    // The app is running on App Engine... 
} 
Các vấn đề liên quan