【问题标题】:How to package Web application separating web services and HTML/JS如何打包分离 Web 服务和 HTML/JS 的 Web 应用程序
【发布时间】:2018-11-14 16:01:09
【问题描述】:

我们正在尝试拆分当前打包为单个 WAR 文件的 Web 应用程序。我们希望将依赖于 Spring Boot 的 Web 服务(RESTful)部分打包到单个 WAR 中。另外,我们希望能够部署包含所有 HTML/JS 组件的前端部分。

我们使用 Tomcat 8 作为应用程序容器。

我们已经分离了代码并为 Web 服务生成了 .WAR,这没关系。我们想知道如何为 HTML/JS 部分做这件事。如何使用 Maven 打包它?如何使用 Tomcat 部署和启动它?然后如何配置 Tomcat,使应用程序的两个部分共享同一个端点:

  • localhost:8080:application/ 用于 HTML/JS 部分
  • localhost:8080:application/rest/ 用于在 SpringBoot 下运行的 Web 服务。

我们现在所拥有的只是将 HTML/JS 文件手动复制到 tomcat 的 webapps 文件夹中,但这对于轻松部署来说并不令人满意。另外,我们没有设法在 Tomcat 中配置端点。

欢迎任何帮助!

【问题讨论】:

  • 你用的是什么前端框架?
  • 我们正在使用 AngularJS。谢谢,

标签: java maven spring-boot tomcat war


【解决方案1】:

有几种方法和工具可以实现您想要实现的目标。

我将建议一种使用我在类似项目中获得的一些工具的方法。虽然这个答案可能看起来是以意见为导向的,但它可能会给你一些想法,让你开始并做出自己的选择。

如果下面描述的任何步骤需要更多详细信息,请告诉我,我会更新它们。

如何打包,使用 Maven?

您需要做的第一件事是将您的项目分成至少两个模块:

  • 带有 REST 服务的战争模块
  • 带有静态文件的客户端模块。

要构建客户端模块,您可以使用Gulp。它将帮助您管理静态 JS/HTML/CSS 文件上的简单任务。 您可以使用 frontend-maven-plugin by com.github.eirslett 启动 gulp 任务:

<plugin>
   <groupId>com.github.eirslett</groupId>
   <artifactId>frontend-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
      <execution>
         <id>install node and npm</id>
         <goals>
            <goal>install-node-and-npm</goal>
         </goals>
         <configuration>
            <nodeVersion>v6.9.1</nodeVersion>
            <npmVersion>3.10.9</npmVersion>
         </configuration>
      </execution>
      <execution>
         <id>npm install</id>
         <goals>
            <goal>npm</goal>
         </goals>
         <configuration>
            <arguments>install</arguments>
         </configuration>
      </execution>
      <execution>
         <id>npm rebuild node-sass</id>
         <goals>
            <goal>npm</goal>
         </goals>
         <configuration>
            <arguments>rebuild node-sass</arguments>
         </configuration>
      </execution>
      <execution>
         <id>gulp build</id>
         <goals>
            <goal>gulp</goal>
         </goals>
         <configuration>
            <arguments>build --no-notification</arguments>
         </configuration>
      </execution>
      <execution>
         <id>gulp test</id>
         <phase>test</phase>
         <goals>
            <goal>gulp</goal>
         </goals>
         <configuration>
            <arguments>test - - no-notification</arguments>
         </configuration>
      </execution>
   </executions>
</plugin>

在本例中,插件启动所需的步骤:

  • npm install -> gulp 需要
  • gulp build -> 你的客户端模块构建
  • gulp 测试 -> 客户端单元测试

然后你需要一个 gulpfile 在你的模块的根目录。

gulp 现在需要做的最少的事情就是将其余服务后端的 URL 提供给您的客户端应用程序。您正在使用角度,所以我建议您使用gulp-ng-constant 在构建阶段动态修改角度常数:

const ngConstant = require('gulp-ng-constant');

gulp.task('build', gulp.series('ngconstant:prod', gulp.parallel('other', 'webpack:dist')));

    gulp.task('ngconstant:prod', function () {
      return ngConstant({
          name: 'yourApp',
          constants: {
              BASE_URL : 'http://www.exemple.com:8080'
          },
          template: conf.constantTemplate,
          stream: true
      })
      .pipe(rename('app.constants.js'))
      .pipe(gulp.dest(conf.app + 'app/'));
    });

在上面的 gulpfile 中,webpack 用于进行实际的构建。

如何使用 Tomcat 部署和启动它?

  • localhost:8080:application/ 用于 HTML/JS 部分
  • localhost:8080:application/rest/ 用于在下运行的 Web 服务 SpringBoot。

我不会这样做。让您的 webapp 和客户端应用程序位于 Tomcat 的同一上下文根中似乎很复杂。

相反,我建议您将静态文件部署到不同的上下文根或不同的 Http 服务器,例如 Apache http 服务器。从技术上讲,您的客户端应用程序不需要应用程序服务器。将它部署到像 Apache 这样的常规、更轻量和更快的 http 服务器将允许它在您重新启动 Tomcat 服务器时仍然运行。

然后你会得到:

现在您的客户端应用程序与您的服务 web 应用程序位于不同的主机上。并且会导致跨域错误。因此,您将不得不配置CORS 以允许您的客户端应用程序向您的服务webapp 发送请求。

另一种解决方案可能是将您的 Apache 设置为您的 tomcat 的代理。您可以使用定义一个将所有请求从端口 8080 转发到 tomcat 服务器的 VirtualHost。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2016-09-27
    相关资源
    最近更新 更多