springboot打成jar包后配置外部资源映射成静态资源

4 篇文章 0 订阅

很多的项目都要上传图片那些,然后通过打包jar包或者war包发布到服务器上,我们不可能把上传图片的文件夹放在jar包或者war包里面,那样会越来越大。所以有了下面的配置,其他框架都好说可以把文件放在tomact下,但是springboot项目是内置tomact所以会有一点的小麻烦。

如果你的项目只要在本地上运行可以参考:https://blog.csdn.net/duangecho/article/details/80099810

如果你的项目要打成jar包放到服务器上请参考如下

进入主题,配置如下:

在springboot项目中的application.properties配置文件下,我们通常会规定一个tomact的虚拟路径,如下:

server.tomcat.basedir=logistics/tomcat

此虚拟路径会在你把springboot项目打成jar包运行后在你的jar包同级目录下产生一个logistics目录。所以我把我要上传的文件的全部放在这个文件夹目录下

springboot项目打包的jar包                                                        

                                           

在logistics文件放入你要上传图片的的文件夹


这是我要上传文件的一些文件夹

然后在springboot启动类中添加过滤器,这里自己踩了很多坑,一遍一遍重新打jar,然后运行,网上许多的配置大多只能添加一个固定的文件路径然后映射成静态资源路径:

public class DemoSpringbootWebApplication extends WebMvcConfigurerAdapter{


   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
      File path = null;
      try {
         path = new File(ResourceUtils.getURL("classpath:").getPath());
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      }
      String gitPath=path.getParentFile().getParentFile().getParent()+File.separator+"logistics"+File.separator+"uploads"+File.separator;
      registry.addResourceHandler("/uploads/**").addResourceLocations(gitPath);
      registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
      super.addResourceHandlers(registry);
   }

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

这里是获取你放项目jar的路径,这有个很大的漏洞就是你项目在你开发工具上运行时和你打成jar包的获取路径不同,在项目上运行时不用返回两次父级目录,而打成jar包运行后获取的jar包的路径要如下的方法,并且打成jar包后获取的根目录会在目录前面加上file:/你项目的路径

String gitPath=path.getParentFile().getParentFile().getParent()+File.separator+"logistics"+File.separator+"uploads"+File.separator;

这里是映射外部文件的代码:

registry.addResourceHandler("/uploads/**").addResourceLocations(gitPath);
这里是映射你项目的静态资源的:

registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");

这里需要注意两个映射的访问路径不能相同我就是在这里改了很久。

其实这里就是项目启动时获取jar包的绝对路径,请注意是绝对路径,然后通过拼接形式访问到你存放文件的目录。可能不同的项目获取文件路径有差异但是都是这个原理:取得你存放文件的绝对路径然后映射成静态资源,要多尝试几次才会成功。

然后把你的springboot项目打成jar,流程如下:

1.打开maven project


2.点击那个m的图标,输入如下代码



3.然后会在你项目的target中生成jar包:


然后你可以把你的项目放到任何文件夹下面然后打开cmd进入到你对应的文件夹下输入:java -jar 你的jar的名称

然后会在你的jar包的同级目录下生成你配置文件中配置的一个虚拟目录,把你的文件放在你下面,上面有说过。

然后通过网址:http://localhost/uploads/image/1525849564604.gif 就会访问到你的那些图片什么乱七八糟的。

SpringBoot是一款快速开发框架,它集了Spring框架、Spring MVC、Spring Data、Spring Security等模块,极大地简化了Java Web应用的开发和部署。然而,当我们将SpringBoot项目打成jar包后,可能会遇到无法获取/static下的静态资源文件的问题。 出现这种问题的原因是jar包的文件不能像war包一样直接被Tomcat等Web容器所加载。SpringBoot应用作为jar包启动时,没有了Tomcat等容器,因此就无法访问静态资源文件了。 解决这种问题的方法有两种。 第一种方法是通过代码的方式让SpringBoot应用识别到static目录下的静态资源文件。我们可以在配置文件(application.properties or application.yml)中加入以下配置: spring.web.resources.static-locations=classpath:/static/ 这样就可以让SpringBoot应用在启动时扫描class path下的/static目录,使其中的静态资源文件得到识别和加载。 第二种方法是使用SpringBoot的嵌入式Web容器。SpringBoot内置了Tomcat、Jetty等Web容器,这些容器会在SpringBoot应用启动时自动启动,并且自动加载静态资源文件。我们只需要在代码中使用如下注解: @EnableWebMvc @Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } } 上述代码片段中的@EnableWebMvc注解表示开启WebMvc配置,@Configuration表示该类是Spring的一个配置类,MvcConfig类继承自WebMvcConfigurerAdapter并重写了addResourceHandlers方法,这个方法将“/static/**”的请求映射到classpath:/static/目录下。这样,在嵌入式Web容器中启动SpringBoot应用时,静态资源文件就能被正确加载了。 总之,无法获取SpringBoot项目静态资源文件的问题,主要是由于jar包没有被Web容器所直接加载所致。采用上述两种方法,均可解决这种问题。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值