Java 使用Spring Boot动态更改静态内容
现在我有一个简单的Spring启动应用程序,它提供我放在Java 使用Spring Boot动态更改静态内容,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,现在我有一个简单的Spring启动应用程序,它提供我放在resources/static/img中的静态映像。这对于显示实际内容来说效果很好,但有两件事我想解决: 我不希望这些图像与生成的.jar文件捆绑在一起,我知道将这些图像放在resources文件夹中就可以了 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动。相反,我希望Spring提供存在于特定文件夹中的任何静态内容,这样我就可以在应用程序运行时添加图像,并让它们在localhost:8080/img/
resources/static/img
中的静态映像。这对于显示实际内容来说效果很好,但有两件事我想解决:
.jar
文件捆绑在一起,我知道将这些图像放在resources
文件夹中就可以了localhost:8080/img/{image name}
自动提供resources/static
为它们提供服务有什么不同。不幸的是,我仍在努力正确配置,因为我根本看不到任何图像。以下是我尝试过的:
@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**").addResourceLocations("file:" + Application.IMAGE_DIR);
super.addResourceHandlers(registry);
}
}
下面是我的应用程序配置:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
static String IMAGE_DIR;
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws IOException {
SpringApplication.run(Application.class, args);
IMAGE_DIR = new File(".").getCanonicalPath() + "/img/";
}
}
同样,我的目标是在我的项目根目录中设置一个名为img
的文件夹,该文件夹将存储我希望webapp在localhost:8080/img/{image name}
上提供的图像。如果可能的话,我希望能够在应用程序运行时将内容添加到此文件夹,并让Spring自动为它们提供服务,而无需重新启动它
有人有什么想法吗?提前感谢。您的方法的问题是,您在运行spring boot应用程序后设置了
IMAGE\u DIR
,并且常量IMAGE\u DIR
未初始化且为null
。更改如下:
public static void main(String[] args) throws IOException {
IMAGE_DIR = "/opt/img/";
SpringApplication.run(Application.class, args);
}
并删除所有
文件(“.”)。getCanonicalPath()
相关内容,它就会工作。当您在所选目录中有新映像时,您的方法将适合您的需要。要解决您的问题,请参见第2点
/resources/public
-img
-js,...
只访问localhost:8080/img/yourmage.png
“public”文件夹下的所有内容都可以访问使用spring boot提供动态内容的一个好解决方案是将静态内容目录链接到一个符号链接,无需缓存,之后,每次需要重新加载时只需重新构建符号链接即可。因此,在你的情况下:
@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**").addResourceLocations("file:/tmp/images/").setCacheControl(CacheControl.noCache());
super.addResourceHandlers(registry);
}
}
之后,您将更改图像目录,如下所示:
Path link = Paths.get("/tmp/images"); //Symlink
Files.deleteIfExists(link);
Files.createSymbolicLink(link, Paths.get(your_new_images_directory));
symlink/tmp/images的选择是个人的,您可以选择您想要的。请注意,您的应用程序需要具有良好的管理员权限才能创建符号链接 谢谢你的回答。结果证明你说对了一半——我所要做的就是把
IMAGE\u DIR
排成一行,效果非常好。谢谢所以这并不能解决问题。每当我们需要在符号链接文件夹中的内容发生更改时重建时,这些资源就无法访问。这并不能解决问题。每次向文件夹添加新内容时,应用程序都需要重新启动,但我需要在不重新启动应用程序的情况下提供文件。