将 CodeStar Spring MVC 项目改为 Spring Boot

问题描述

我有一个在 IDE 中运行时完美运行的 Spring Boot 项目。我想通过 AWS CodeStar 运行它。不幸的是,CodeStar 创建的认 Spring 模板使用的是 Spring MVC。

我不能只用我的 Spring Boot 项目覆盖认的 Spring MVC 项目(它不起作用)。我可以将我的一些资源复制到 MVC 项目,例如 index.html 并且可以。但是像 Thymeleaf 这样的功能就不起作用了。由于这个原因和其他原因,我想将提供的 Spring MVC 更改为我已经拥有的 Spring Boot 结构。

我按照此处的说明进行操作:https://www.baeldung.com/spring-boot-migration

不幸的是,这无济于事。我可以创建应用程序入口点并添加 Spring Boot 依赖项而不会破坏应用程序。但是当我删除认依赖项或与 MVC 关联的配置时,应用程序会中断。尝试访问 URL 时,我收到一个 404 错误描述:

源服务器没有找到目标资源的当前表示或不愿透露存在的表示。

调试此错误消息(例如 https://www.codejava.net/java-ee/servlet/solved-tomcat-error-http-status-404-not-found)没有帮助。

该消息似乎已连接到网络资源。我在文件夹资源以及 webapp/resources 中有我的网络资源。而且 Spring Boot 不需要任何位置配置,对吧?它认使用此位置。

有人能告诉我要删除哪些内容以及添加哪些内容才能使用我现有的 Spring Boot 项目吗?

编辑:

这是 AWS CodeStar Spring Web 应用程序认模板的链接https://github.com/JanHorcicka/AWS-codestar-template

这是我的 Spring Boot 项目结构:

Structure

解决方法

我意识到您之前表示您尝试使用 Spring Boot 项目并进行了一些修改但没有成功,但我认为实际上有可能在 AWS CodeStar 上成功部署您的应用程序,这将是我的建议。

我还意识到在您的屏幕截图中包含了几个必需的工件和类,但请仔细检查您在将应用程序部署到 AWS CodeStar 时是否遵循了这些步骤。

让我们从在本地运行的 Spring Boot 项目的原始版本开始,不做任何修改,然后执行以下更改。

首先,如您共享的 GitHub link 所示,请确保在您的项目中包含以下文件。 AWS 的部署基础设施需要它们:

  • appspec.yml
  • buildspec.yml
  • template.yml
  • template-configuration.json
  • 整个scripts目录

请根据您的特定需求调整任何必要的配置,尤其是 template-configuration.json

然后,在您的 pom.xml 中执行以下修改。其中一些是 Spring Boot 作为 traditional deployment 工作所必需的,而其他一些是 AWS CodeStar 中的部署所必需的。

确保将 packaging 表示为 war

<packaging>war</packaging>

为确保嵌入的 servlet 容器不会干扰部署 war 文件的 Tomcat,请按照上述文档中的建议将 Tomcat 依赖项标记为已提供:

<dependencies>
    <!-- … -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- … -->
</dependencies>

或者在您的 pom.xml 中排除 Tomcat 依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>

如有必要,请使用某种配置文件应用此排除,该配置文件允许您同时在本地和外部 servlet 容器中启动 Spring Boot。

接下来对maven war插件进行参数化以符合AWS CodeStar部署需求:

<build>
    <pluginManagement>
        <plugins>
          <!-- ... -->
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.2</version>
              <configuration>
                  <warSourceDirectory>src/main/webapp</warSourceDirectory>
                  <warName>ROOT</warName>
                  <failOnMissingWebXml>false</failOnMissingWebXml>
              </configuration>
          </plugin>
          <!-- ... -->
       <plugins>
    </pluginManagement>
</build>

我认为没有必要,但只是为了避免任何类型的问题,调整您最终的 build 的名称:

<finalName>ROOT</finalName>

最后,如 Spring documentation 中所示,请确保您的 MyProjectApplication - 我假设此类是您的主要入口点子类 SpringBootServletInitializer 并相应地覆盖 configure ,类似:

@SpringBootApplication
public class MyProjectApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyProjectApplication.class);
    }

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

}

请随时根据您的特定用例调整课程。

通过此设置,尝试部署您的应用程序并查看它是否有效:也许您会发现某种库依赖问题,但我认为在大多数情况下它应该可以正常工作。

首先,您可以尝试按照您在项目模板中提供的说明在本地部署您稍后将部署到 AWS CodeStar 的应用程序版本,基本上,一旦配置了答案中描述的必要更改,通过运行:

mvn clean package

并在本地 tomcat 环境中部署生成的战争。请注意,标准 tomcat 安装中可能已经存在 ROOT 应用程序(您可以通过检查 webapps 文件夹来验证它):您可以覆盖该 war 文件。

对于本地测试,您甚至可以选择不同的应用程序名称(在 build.finalName 文件中配置 warNamepom.xml):重要的是验证应用程序是否在本地成功运行。

如果您愿意,您可以选择将应用程序直接部署到 AWS CodeStar 并在必要时稍后检查日志。

无论如何,请注意两件事:一方面,如果您在应用程序中配置了任何绝对路径,这可能是您在评论中提到的 404 问题的原因。请注意,您的应用程序将使用上下文根“/”部署在 Tomcat 中。

另一方面,请查看您如何配置数据库访问权限。 可能您使用了 application.properties 并且它很好,但是请注意,在使用应用程序时,数据库必须是可访问的:也许 Spring 无法创建必要的数据源,以及持久性管理器或与 and 相关的相关内容,因此,应用程序没有启动。同样,这可能是 404 错误代码的原因。

为了简化数据库连接,为了测试,乍一看,我建议您使用简单的属性来配置数据源,即驱动程序类、连接字符串、用户名和密码。如果该设置工作正常,您可以稍后启用 JNDI 或认为必要的内容。

请记住,如果您需要在 Tomcat 中更改上下文名称和/或定义数据源池,您可以将 context.xml 文件放置在您的网络应用根路径中的 META-INF 目录下。

这个 context.xml 应该类似于:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/"> 

  <Resource name="jdbc/myDS" 
    type="javax.sql.DataSource"
    maxActive="100" 
    maxIdle="30" 
    maxWait="10000" 
    url="jdbc:mysql://localhost:3306/myds" 
    driverClassName="com.mysql.jdbc.Driver" 
    username="root" 
    password="secret" 
  /> 

</Context>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...