在apache tomcat上部署war文件时未加载CSS和JS文件

Posted

技术标签:

【中文标题】在apache tomcat上部署war文件时未加载CSS和JS文件【英文标题】:CSS and JS file not loading while deploying war file on apache tomcat 【发布时间】:2017-05-02 14:50:46 【问题描述】:

使用 spring-boot-starter-web-mvc 进行初始开发。当我在服务器上部署 war 文件时,它不会加载 css 和 js 文件,但是当我使用 spring boot 运行相同的代码时,它是工作正常。下面是加载js和css文件的目录结构和配置。谁能让我知道怎么回事?仅对项目使用基于 java 的配置。在部署项目之前,我已经在doc 中引用了 8.1.1,并使用了相同的 pom 文件配置,如下所示。

配置文件-

public class ViewWebAppConfig extends WebMvcConfigurerAdapter 

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) 
        // configuration for assets/ static files
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    

    @Bean
    public InternalResourceViewResolver viewResolver() 
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    

    @Bean
    public ResourceBundleMessageSource messageSource() 
        ResourceBundleMessageSource rb = new ResourceBundleMessageSource();
        rb.setBasenames(new String[]  "validation" );
        return rb;
    


pom.xml 文件

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <log4j.version>2.7</log4j.version>
    </properties>

    <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
        </dependency>
         <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <!-- Dependency for rendering jsp pages  -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>jasper-compiler</artifactId>
            <version>5.5.23</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>jasper-runtime</artifactId>
            <version>5.5.23</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>jasper-compiler-jdt</artifactId>
            <version>5.5.23</version>
            <scope>provided</scope>
        </dependency>
        <!-- Dependency for rendering jsp pages  -->

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>$log4j.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>$log4j.version</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
    </dependencies>

使用 spring-tags 加载 js 和 css 如下 -

<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<spring:url value="/resources/assets/js/custom.min.js" var="customJS" />
<script src="$customJS"></script>

<link href="$customFieldAgent" rel="stylesheet"/>
<spring:url value="/resources/assets/css/customfieldAgent.css" var="customFieldAgent" />

下面是服务器日志-

17:03:10.014 [http-nio-8080-exec-7] 调试 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 未找到 [/$starrrJS] 17:03:10.014 [http-nio-8080-exec-7] 的处理程序方法 WARN org.springframework.web.servlet.PageNotFound - 找不到映射 DispatcherServlet 中带有 URI [/ui/$%7BstarrrJS%7D] 的 HTTP 请求 名称“调度员”17:03:10.014 [http-nio-8080-exec-7] 调试 org.springframework.web.servlet.DispatcherServlet - 成功 完成请求 17:03:10.018 [http-nio-8080-exec-4] 调试 org.springframework.web.servlet.DispatcherServlet - DispatcherServlet 名称为“调度程序”的处理 GET 请求 [/ui/$%7BcustomJS%7D] 17:03:10.018 [http-nio-8080-exec-4] 调试 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 查找路径 /$customJS 的处理程序方法 17:03:10.019 [http-nio-8080-exec-4] 调试 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 未找到 [/$customJS] 17:03:10.019 [http-nio-8080-exec-4] 的处理程序方法 WARN org.springframework.web.servlet.PageNotFound - 找不到映射 DispatcherServlet 中带有 URI [/ui/$%7BcustomJS%7D] 的 HTTP 请求 名称'调度程序'17:03:10.019 [http-nio-8080-exec-4]调试 org.springframework.web.servlet.DispatcherServlet - 成功 完成请求

【问题讨论】:

github.com/MFaisalHyder/REST_API 请检查这个项目,看看这是否有帮助,如果没有整理出来,我会发布答案 看看你在位置提供(/resources/),而还有另一个目录 /assets/ ,位于实际资源文件夹之上。 registry.addResourceHandler("/resources/**/*").addResourceLocations("/resources/assets/");试试看,让我知道它是否有效 不,它不起作用。已更新服务器日志。 试过很多方法,用了"c:url",正常的约定还是不行。 请看我项目中的目录结构。在 WEB-INF\resources\css, js, img 中移动你的资源文件夹,同时删除额外的头文件夹资产 【参考方案1】:

尝试这种方式对我有用。

项目结构:

src/main/webapp/static/[css,js,images]
src/main/webapp/WEB-INF/views/[for all .jsp pages]

配置

@Configuration
@ComponentScan(basePackages = "parent package name where all packages reside")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter 

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) 
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) 
        // when static resources are inside resources folder under WEB-INF
        // registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/");

        // when static resources are inside static folder under webapp
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    

DispatcherServlet知道如何打包...

import javax.servlet.Filter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 

    @Override
    protected Class<?>[] getRootConfigClasses() 
        return new Class[]  ApplicationConfiguration.class ;
    

    @Override
    protected Class<?>[] getServletConfigClasses() 
        return null;
    

    @Override
    protected String[] getServletMappings() 
        return new String[]  "/" ;
         

现在在视图上调用这些...

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <link href="<c:url value='/static/css/application.css' />" rel="stylesheet"></link>
    </head>

在你的 pom.xml 中添加这个

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>

希望这会对你有所帮助。

【讨论】:

谢谢,我会查的。【参考方案2】:

在我的 Spring Boot 项目中,我尝试将 WAR 文件部署到 TOMCAT,但它无法识别资源路径,它会抛出 404 File not found 错误,但是当我作为 SpringBootApplication 运行时,它工作正常,仅当作为 WAR 文件部署到 TOMCAT 时才发出。所以最后我揭示了这个问题,现在它在我的项目结构上完美运行

将这些行添加到 application.properties 文件中

spring.resources.add-mappings=true
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/

我来自https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

效果很好……

【讨论】:

【参考方案3】:

对于这个 js,images,css 或来自 war 文件之外的图像或任何文件都可以显示,也可以通过使用 下面这行是两种情况的共同点

spring.resources.add-mappings=true

要在 Spring Boot War 文件或 Spring 的任何文件中访问或显示此内容,您必须放入 application.properties 文件或任何属性文件

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/

对于外部访问文件或显示图像的外部文件,您可以放置​​为

spring.resources.static-locations=file:///C:/xxxxxxxxx/xxxxxxxxx

正如 vignesh R 所说,它工作得很好,试试吧

【讨论】:

以上是关于在apache tomcat上部署war文件时未加载CSS和JS文件的主要内容,如果未能解决你的问题,请参考以下文章

为多个域部署Apache Tomcat的WAR文件

在 LAMP 上部署 WAR 文件

Spring Boot:在 Tomcat 7 上部署 WAR

使用批处理文件在 XAMPP 中部署 WAR 文件

在Tomcat上部署war文件

linux系统下部署war包