Angular 和 Spring Boot:配置使它们高效地协同工作

2023-12-05

Angular 项目构建依赖于角度 CLI 工具.
Spring Boot项目构建依赖于Spring Boot Maven 插件.

那么如何配置和构建一个在前端托管 Angular 应用程序的 Spring Boot 应用程序呢?

我的要求如下:

  • 使用 Maven 作为 Java 构建工具

  • 在由 Spring Boot 引导的嵌入式 Tomcat 实例中运行应用程序。

  • 开发环境中高效的构建生命周期

  • 开发后环境的可靠构建


角度配置

首先,我需要配置 Angular 应用程序,以使 Angular 应用程序的构建可在 Spring Boot Maven 项目的源代码目录中使用。

一个简单的方法需要进行 2 个简单的更改:

  • 将 Angular 应用程序文件夹移动到 Spring Boot Maven 项目的根文件夹中。

  • 修改.angular-cli.json配置文件到 改变apps/outDir值即"dist"默认情况下,由"../src/main/resources/static".

那是 :

{
  ...
  "apps": [
    {
      "root": "src",
      "outDir": "../src/main/resources/static",
  ...
}

默认情况下,Spring Boot 从名为的目录提供静态内容/static (or /public or /resources or /META-INF/resources)在类路径中或从根目录ServletContext.

这样,当我执行ng build命令时,Webpack 捆绑的 Angular 应用程序将位于 Spring Boot 静态内容的资源目录中。


Spring引导配置

我不想在开发和开发后环境中执行完全相同的 Spring Boot 构建任务。
当然,这并不意味着构建将根据目标环境产生独特的功能行为。

开发中,我想要快速构建。
当我修改源代码(Java、JavaScript 或其他任何代码)时,我需要快速反馈。例如,我不想在每次修改源代码时打包和重新部署应用程序。
我也不想每次更改源代码时都做一些特殊的事情。
我希望更改能够快速、自动地反映在应用程序中。

为开发后环境构建应用程序,我想要一个可靠的构建并且包含最终内容。
以下是开发后环境的详细要求:

  • 我想从头开始执行 Angular 应用程序(甚至整个 Spring Boot 应用程序)的完整构建。
    在开发过程中,每次修改源代码时对 webpack 捆绑应用程序进行增量更新是没问题的,但是当我交付我的应用程序时,我将真正最大限度地减少潜在的副作用。
    我不在乎是否必须从头开始打包应用程序,因为我不会经常创建此构建,并且我还将此任务留给了自动化工具,例如持续集成。

  • 我想通过运行部署它的嵌入式 Tomcat 来以自治的方式重新打包应用程序。
    The repackage goalSpring Boot Maven 插件实现了它。

为了能够以干净/可靠的方式从一种构建类型切换到另一种构建类型,我想指定两个不同的构建。

Maven(作为 Gradle)提供了建立档案功能很好地满足了这一要求。
所以,我用它。

以下是开发构建的 Maven 配置文件:

<profile>
    <id>fast-build</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>
                        -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
                    </jvmArguments>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

一些附加说明:

  • 在开发中,我希望始终有一种方法可以在需要时添加断点,并且无需重新启动应用程序。
    The jvmArgumentsSpring Boot Maven 插件的参数按以下方式赋值:

    <jvmArguments> -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 </jvmArguments>

指定5005作为调试器侦听器的端口而不被阻塞(suspend=n)对于服务器。

  • 为了启用静态资源的热刷新,我设置了addResources to true.

以下是开发后构建的 Maven 配置文件(加上它使用的声明属性):

<properties>
    ...
    <node.version>v6.9.1</node.version>
    <npm.version>3.10.8</npm.version>
    ...
</properties>
    ...
    <profile>
        <id>full-build</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>com.github.eirslett</groupId>
                    <artifactId>frontend-maven-plugin</artifactId>
                    <version>1.2</version>
                    <configuration>
                        <installDirectory>angular-app</installDirectory>
                        <workingDirectory>angular-app</workingDirectory>
                    </configuration>
                    <executions>
                        <execution>
                            <id>install node and npm</id>
                            <goals>
                                <goal>install-node-and-npm</goal>
                            </goals>
                            <configuration>
                                <nodeVersion>${node.version}</nodeVersion>
                                <npmVersion>${npm.version}</npmVersion>
                            </configuration>
                        </execution>
                        <execution>
                            <id>install angular app</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>
                            <configuration>
                                <arguments>install</arguments>
                            </configuration>
                        </execution>                            
                        <execution>
                            <id>npm build</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>
                            <configuration>
                                <arguments>run build</arguments>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

一些附加说明:

  • angular-app此处声明:<workingDirectory>angular-app</workingDirectory>是我在Maven Spring Boot项目中复制的角度应用程序的目录。

  • <installDirectory>angular-app</installDirectory>是工作文件夹frontend-maven-plugin将安装节点和所需的依赖项。
    就其本身而言,angular-app目录不直接用于生成打包的应用程序。
    因此,使用这个目录就可以了,并且还允许从 Angular CLI 运行 Angular 应用程序。


用于运行构建的 Angular 和 Spring Boot 命令

  • 对于开发构建:

    • Angular CLI:来自angular-app目录,执行ng build -w。 它将构建 Angular 应用程序并增量更新构建(w用于手表)
    • Spring Boot :从maven项目的基目录中,执行mvn spring-boot:run -Pfast-build(欢迎提供执行它的脚本)
  • 对于开发后构建:

    • 不需要 Angular CLI。
    • Spring Boot :从maven项目的基目录中,执行mvn spring-boot:run
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 和 Spring Boot:配置使它们高效地协同工作 的相关文章

  • Angular 5 Http拦截器刷新JWT令牌

    我已经实现了令牌保存 检索的逻辑 并且我也有刷新调用 问题是 当我在 HttpInterceptor 中拦截 403 时 同时进行的其他调用也会刷新令牌 我很乐意保留这些调用 直到我的令牌刷新为止 创建我所说的请求 信号量 Injectab
  • Angular 2 获取当前路线

    所以我需要以某种方式检查我是否在主页上执行某些操作 而在其他页面上则不执行此操作 该组件也在所有页面上导入 如果我在主页上 如何检测该组件 Thanks 尝试这个 import Router from angular router expo
  • Maven 中不同配置文件的不同 SCM

    在我的项目中 我们必须使用 maben build number 插件来构造 jar 的最终名称 为此我们使用 SCN 的修订版 因此我们需要 SCM 但是我们在无法直接访问的受控环境和本地测试环境上有两个 SVN 因此对于我们的 poup
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • 如何从引用的java项目访问静态资源(WEB-INF)文件夹中的文件?

    我有一个 Web 应用程序 其中包含一个作为 spring bean 公开的应用程序服务之一的配置 xml 文件 另外 我在同一工作区中有一个独立的 java 应用程序 它从其 pom xml 引用我的 Web 应用程序项目 它使用 Spr
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS
  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • Swagger for Micronaut 与 Maven

    我想从 Spring Boot 2 切换到 Micronaut 框架 而且我在 Swagger 设置上遇到了困难 在 Spring Boot 2 项目中 我有以下依赖项
  • 当应用程序位于前台时,Angular 8 firebase 推送通知不起作用

    我正在按照此文档在我的 Angular Web 应用程序上实现 FCM 当我发送通知时 当应用程序未处于活动状态时 它会成功接收 接收后台通知 但如果应用程序处于活动状态 我就不会收到通知 请按照下列步骤操作 https dev to ma
  • 使用 Netbeans(和 Maven)运行正确的上下文根

    当我从 Netbeans 7 2 运行项目时遇到了一些问题 我还使用 Glassfish 3 1 2 服务器 事实上 我正在将现有项目从 Ant 迁移到 Maven 我的 pom xml 已完成 并且我已经使用了上下文根的自定义 如下所述
  • 模块解析失败:意外的标记 (4:0)

    我正在尝试将 FULLCALENDAR 添加到我的 Angular v14 项目中 但在所有设置之后我突然面临这个错误 知道如何处理这个错误吗 包 json fullcalendar angular 5 11 0 fullcalendar
  • spring boot 使用哪个“切片”来测试服务组件

    我正在使用 spring boot 开发一个rest api 它由标准层组成 控制器 RestController 处理传入的http请求并公开api端点 然后是服务层 Service 最后是存储库层 Repository 我的问题是关于单
  • 如何在 Angular 2 中执行无限动画?

    基本上 我想利用 Angular 中的 web animations api polyfill 当前为 4 来对元素执行无限动画 让我们看一个基本的非角度示例 var ball document getElementById ball ba
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • Angular-cli AOT 构建失败,并显示“致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足”

    我正在尝试使用 AOT 构建我的 angular cli 项目 ng build aot 但它因错误而失败 致命错误 CALL AND RETRY LAST 分配失败 JavaScript 堆内存不足 如果我用 prod flag 任何想法
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Netbeans 8 不会重新加载静态 Thymeleaf 文件

    我通过 Maven 使用 Spring Boot 和 Thymeleaf 当我进行更改时 我似乎无法让 Netbeans 自动重新部署我的任何 Thymeleaf 模板文件 为了看到更改 我需要进行完整的清理 构建 运行 这需要太长的时间
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • 当选项卡索引更改时,mat-tab-group 滚动到页面顶部

    我有奇怪的行为mat tab group在角度材料中 当我更改选项卡索引时 它会将页面滚动到顶部 知道为什么吗 这是角度材料库中的一个已知错误 请参阅here https github com angular material2 issue

随机推荐