2013-04-30 32 views
10

Chúng tôi làm gì:

Chúng tôi chạy ứng dụng Play2 trên Cloudbees và chúng tôi tải một tập tin từ '/ conf' thư mục (bên trong classpath của ứng dụng).Load file từ '/ conf' thư mục trên Cloudbees

Những 2 đoạn mã được làm việc trong địa phương và tại Heroku

Play.application().getFile("conf/myfile.json") 

new File("conf/myfile.json") 

Tuy nhiên, trên Cloudbees, chúng tôi nhận FileNotFoundException:

java.io.FileNotFoundException: /var/genapp/apps/..../conf/myfile.json (No such file or directory) 

Vậy làm thế nào để tải một tập tin từ classpath trên Cloudbees?

+0

Tôi nghĩ rằng nó hoạt động trên Heroku vì chúng không chạy theo phong cách sản xuất - chúng chỉ chạy CLI chơi để khởi động nó, vì vậy nó chỉ là do tai nạn mà nó hoạt động ở đó. –

Trả lời

12

Vâng, các file trong '/ conf' là trong classpath và không nằm trong hệ thống tập tin vì vậy chúng tôi cần phải tải các tập tin theo cách này:

Play.application.resourceAsStream("myfile.json") 
//.resource() also works - depends what we want 

Lưu ý rằng chúng tôi không đặt "conf" trong đường dẫn - các tệp trong đó có trên đường dẫn lớp trong thư mục gốc.

Lưu ý rằng trong quá trình sản xuất, nó xuất phát từ một lọ/mã zip, không phải là tệp - vì vậy getFile có phần gây hiểu lầm khi chơi.

Michael Neale từ Cloudbees mở vấn đề này: https://github.com/playframework/Play20/issues/1079

Cloudbees tài liệu đã được cập nhật: https://wiki.cloudbees.com/bin/view/RUN/Playframework#HLoadingconfigfilesinproduction

+0

Không chắc chắn khi điều này thay đổi trên Api Play nhưng tôi phải sử dụng Play.application(). ResourceAsStream thay vì Play.application.resourceAsStream – grahamrb

+0

Nếu tôi muốn tệp không phải là tệp cấu hình thì sao? Tôi không thích ý tưởng đưa các tệp không liên quan đến conf vào thư mục conf chỉ để tôi có thể truy cập chúng thông qua resourceAsStream() – cdmckay

+2

Các tệp trong thư mục 'conf /' được đóng gói dưới dạng 'default-appname-version.jar thư mục 'bên trong 'lib /'. Vì vậy, sự hiểu biết chính xác sẽ được rằng tất cả các tập tin bên trong * jar mặc định * có thể truy cập. Tuy nhiên, cũng có một thư mục 'conf/'trong kho lưu trữ zip được tạo bằng lệnh' dist'. Các tệp trong thư mục 'conf /' này không có trong classpath. – tuxdna

1

Dường như các ứng dụng Heroku chạy chơi qua "chơi bắt đầu" hoặc "chơi chạy" mà không phải là khuyến khích cách để các ứng dụng chơi chạy trong sản xuất - điều này giải thích tại sao "conf" hiển thị ở đó - mặc dù điều này có thể thay đổi trong phiên bản phát sau này.

2

Tôi đang sử dụng trò chơi 2.4. Những gì phù hợp với tôi là

import play.Play; 
import org.apache.commons.io.IOUtils; 

    String myfile = IOUtils.toString(Play.application().resourceAsStream("myfile.json")); 

LƯU Ý: application() được gọi là phương pháp tĩnh.