【问题标题】:Adding webpack JS bundle to Spring/JSP WAR将 webpack JS 包添加到 Spring/JSP WAR
【发布时间】:2017-01-27 12:42:50
【问题描述】:

我最近看到了frontend-maven-plugin,尽管我会在我正在处理的遗留项目 (JSP) 中尝试一下以简化部署。

我把所有的 .js 代码都拿出来变成了一个 webpack 项目,当用 npm run dist 调用它时会创建 frontend_bundle.js。

然后我按照 [使用说明] (https://github.com/eirslett/frontend-maven-plugin#usage) 添加了一个 pom:

  <artifactId>frontend</artifactId>
  <version>1.5.1</version>
  <packaging>jar</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>com.github.eirslett</groupId>
        <artifactId>frontend-maven-plugin</artifactId>
        <version>1.0</version>

        <executions>
          <execution>
            <id>npm run dist</id>
            <goals>
              <goal>npm</goal>
            </goals>
            <configuration>
              <arguments>run dist</arguments>
            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>

当我 `mvn clean install' 时,我将整个 frontend_bundle.js 放在一个 webjar 中 - 太棒了!

然后在服务器端我将 jar 包含为依赖项:

<!-- FRONTEND DEPENDENCY -->
    <dependency>
      <groupId>com.counter</groupId>
      <artifactId>frontend</artifactId>
      <version>1.5.1</version>
    </dependency> 

当我 `mvn package' 时,我得到一个 WAR,前端包含在 lib/ 中 唯一的问题是我无法完全链接到 JSP 中的 frontend_bundle.js(我得到 404):

WEB-INF/pages/index.jsp:

<html>
<body>
    <script src="/webjars/counter-webapp-frontend/1.5.1/frontend_bundle.js"></script>

<h1>Maven Webpack JSP Example</h1>

<div id='inject'>

</div>

</body>
</html>

com.example.controller 包中的入口点:

@Controller
public class BaseController extends WebMvcConfigurerAdapter  {

    private static final String VIEW_INDEX = "index";

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        if (!registry.hasMappingForPattern("/webjars/**")) {
            registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String entryPoint(ModelMap model) {
        // return index.jsp
        return VIEW_INDEX;
    }

}

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <display-name>Counter Web Application</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

上下文:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.example.controller" />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

现在,当我部署到 maven 时,我得到一个 404 登录控制台:

获取http://localhost:8080/webjars/frontend/1.5.1/frontend_bundle.js

【问题讨论】:

    标签: java spring maven jsp webpack


    【解决方案1】:

    我想我解决了。

    更新 web xml 以使用 ee 版本 3 后:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0">
    

    并在上下文中链接到脚本:

    <script src="${pageContext.request.contextPath}/webjars/counter-webapp-frontend/0.0.1/vendor_bundle.js"></script>
    <script src="${pageContext.request.contextPath}/webjars/counter-webapp-frontend/0.0.1/app_bundle.js"></script>
    

    JS 脚本正在加载。

    【讨论】:

      【解决方案2】:

      您需要将 webjar 内容显式映射到 URI,如 here 所述

      @Configuration
      @EnableWebMvc
      public class WebConfig extends WebMvcConfigurerAdapter {
      
          @Override
          public void addResourceHandlers(ResourceHandlerRegistry registry) {
              registry.addResourceHandler("/public**").addResourceLocations("classpath:/public/");
          }
      }
      

      编辑:已在提供的源代码中

      是的,你是对的,没有看到。 其他可能的问题可能是:

      如果映射了任何其他 webjar,'if' 将禁止注册:

       if (!registry.hasMappingForPattern("/webjars/**")) 
      

      在 if 处设置断点,看看那里会发生什么...

      您使用的 url 与资源路径不匹配: 您正在映射到

      classpath:/META-INF/resources/webjars/
      

      网址不应该包含'webjars'可能是这样的:

      GET http://localhost:8080/frontend/1.5.1/frontend_bundle.js
      

      您确实做到了,但可能值得仔细检查 WAR 并查看资源是否位于您期望的位置....

      【讨论】:

      • 感谢您的回答@Stefan Isele - 但是(没有注释)这不正是我在 addResourceHandlers 下所拥有的吗?我添加了注释,但这还没有解决它。
      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2014-12-27
      • 2016-05-29
      相关资源
      最近更新 更多