2015-02-17 19 views
14

Sử dụng ứng dụng web Khởi động mùa xuân Tôi cố gắng phân phối tài nguyên tĩnh của tôi từ một thư mục hệ thống tệp bên ngoài dự án của tôi.Cung cấp tài nguyên tĩnh từ hệ thống tệp | Spring Boot Web

cấu trúc thư mục trông giống như: - Cấu hình

  src 
      main 
       java 
       resources 
      test 
       java 
       resources 
      pom.xml 
      ext-resources (I want to keep my static resources here) 
       test.js 

mùa xuân: -

@SpringBootApplication 
public class DemoStaticresourceApplication extends WebMvcConfigurerAdapter { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoStaticresourceApplication.class, args); 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/test/**").addResourceLocations("file:///./ext-resources/") 
       .setCachePeriod(0); 
    } 
} 

Hitting 'http://localhost:9999/test/test.js' trong trình duyệt của tôi cho lại một 404.

Làm thế nào tôi nên cấu hình ResourceHandlerRegistry để phục vụ tài nguyên tĩnh từ thư mục 'tài nguyên mở rộng' được đề cập ở trên?

Tôi có thể bật/tắt bộ nhớ cache cho môi trường dev/prod.

Cảm ơn

CẬP NHẬT 1

Cho đường dẫn tập tin tuyệt đối hoạt động: -

@Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/test/**") 
       .addResourceLocations(
         "file:///C:/Sambhav/Installations/workspace/demo-staticresource/ext-resources/") 
       .setCachePeriod(0); 
} 

Làm thế nào tôi có thể cung cấp vị trí tương đối? Đường dẫn tuyệt đối sẽ làm cho cuộc sống của tôi trở nên khó khăn trong quá trình xây dựng quy trình triển khai &.

+0

bạn đã thử đường dẫn tuyệt đối chưa? (và có thể bạn chỉ có một '/' nhiều hơn trong URL của mình :)) – sodik

+0

Đường dẫn tuyệt đối hoạt động. Xem câu hỏi được cập nhật. Có cách nào để cung cấp đường dẫn tương đối không? –

+0

xây dựng nó :) ví dụ: File ("ext-resource") getAbsoluteFile(). ToURI ... kiểm tra javadoc với cú pháp thích hợp – sodik

Trả lời

17

file:/// là một URL tuyệt đối trỏ đến thư mục gốc của hệ thống tập tin và, do đó, file:///./ext-resources/ có nghĩa là mùa xuân Boot đang tìm kiếm các nguồn lực trong một thư mục có tên ext-resources trong thư mục gốc.

Cập nhật cấu hình của bạn để sử dụng một cái gì đó như file:ext-resources/ làm URL.

+0

Đã hoạt động !!! –

3

Quản lý cấu hình Spring Boot cho phép nhiều chiến lược tại đây (see Boot reference documentation).

Khi sử dụng đường dẫn tĩnh, đầy đủ hoạt động ở đây, tôi khuyên bạn không nên sử dụng chiến lược đó vì mọi nhà phát triển trong nhóm của bạn sẽ không chia sẻ cùng một bố cục không gian làm việc.

Bạn có thể sử dụng một số chiến lược được chọn trong that example project và đặt đường dẫn này là thuộc tính cấu hình.

Một khi điều này là một tài sản, giả sử resources.projectroot, một số cách để thiết lập này:

  • mỗi nhà phát triển tự đặt giá trị này trong cô tập tin application.yml hoặc application.properties
  • biến sử dụng env khi chạy dự án như RESOURCES_PROJECTROOT=/home/user/demo/ ./gradlew bootRun (ở đây, gradle + unix) hoặc set RESOURCES_PROJECTROOT=%cd%mvn spring-boot:run (ở đây, maven + cửa sổ)

Bạn sẽ tìm thấy nhiều ot các giải pháp của cô phù hợp với nhu cầu của bạn bằng cách xem công cụ xây dựng, hệ điều hành lựa chọn của bạn và tất cả các chiến lược cấu hình mà Boot cung cấp.

+1

Vậy điều đó có nghĩa là các đường dẫn tương đối là không thể? Di chuyển ra đường dẫn tuyệt đối trong tệp .properties là tốt nhưng, chúng ta có thể không chỉ cung cấp một vị trí tương đối (như đã đề cập trong câu hỏi) không? –

+0

Bạn có thể sử dụng cả đường dẫn tương đối và tuyệt đối. tệp: // (thông báo hai dấu gạch chéo) chỉ là một điểm đánh dấu cho tài nguyên của tệp loại. Sau đó bạn cung cấp đường dẫn của bạn. Nếu đường dẫn được chỉ định bắt đầu bằng dấu gạch chéo thì nó được hiểu là đường dẫn bắt đầu từ gốc của hệ thống tệp. Nếu nó không bắt đầu bằng dấu gạch chéo, nó là một đường dẫn tương đối từ thư mục làm việc của Spring Boot. file: // không phải là phát minh Spring, phần trước: // được gọi là lược đồ. Kiểm tra javadoc cho lớp URI - https://docs.oracle.com/javase/8/docs/api/java/net/URI.html – joensson

0

Đây là những gì tôi đã làm trong lớp webconfig, bên trong phương pháp addResourceHandlers:

boolean devMode = this.env.acceptsProfiles("development"); 
String location; 
if (devMode) { 
    String currentPath = new File(".").getAbsolutePath(); 
    location = "file:///" + currentPath + "/client/src/"; 
} else { 
    location = "classpath:static/"; 
} 
1

Xuân Boot Maven Plugin có thể thêm các thư mục thêm vào classpath. Trong trường hợp của bạn, bạn có thể bao gồm trong pom của bạn.

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>${spring.boot.version}</version> 
    <configuration> 
     <folders> 
      <folder>${project.build.directory}/../ext-resources</folder> 
     </folders> 

     ... 
    </configuration> 
</plugin> 

Vì vậy theo cách đó bạn không cần phải nhập bất kỳ mã cứng nào trong lớp học của mình. Chỉ cần bắt đầu webapp của bạn với

mvn spring-boot:run 
Các vấn đề liên quan