5

我有一个在 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)没有帮助。

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

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

编辑:

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

这是我的 Spring Boot 项目结构:

结构

4

1 回答 1

2

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

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

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

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

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

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

然后,在您的pom.xml. 其中一些是 Spring Boot 作为传统部署所必需的,而另一些则是 AWS CodeStar 中的部署所必需的。

确保您指示packagingwar

<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>

或排除 Tomcat 依赖项pom.xml

<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 文档中所指出的那样,请确保您的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 环境中部署生成的战争。请注意,该ROOT应用程序可能已经存在于标准的 tomcat 安装中(您可以通过检查webapps文件夹来验证它):您可以覆盖该 war 文件。

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

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

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

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

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

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

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>
于 2021-01-29T09:48:01.217 回答