将 CodeStar Spring MVC 项目改为 Spring Boot

Jan*_*čka 5 java spring-mvc thymeleaf spring-boot aws-codestar

我有一个在 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 项目结构:

结构

jcc*_*ero 2

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

\n

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

\n

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

\n

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

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

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

\n

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

\n

请确保您指定packagingwar

\n
<packaging>war</packaging>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
<dependencies>\n    <!-- \xe2\x80\xa6 -->\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-tomcat</artifactId>\n        <scope>provided</scope>\n    </dependency>\n    <!-- \xe2\x80\xa6 -->\n</dependencies>\n
Run Code Online (Sandbox Code Playgroud)\n

或者排除 Tomcat 依赖项pom.xml

\n
<dependency>\n  <groupId>org.springframework.boot</groupId>\n  <artifactId>spring-boot-starter-web</artifactId>\n  <exclusions>\n    <exclusion>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-tomcat</artifactId>\n    </exclusion>\n  </exclusions>\n</dependency>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
<build>\n    <pluginManagement>\n        <plugins>\n          <!-- ... -->\n          <plugin>\n              <groupId>org.apache.maven.plugins</groupId>\n              <artifactId>maven-war-plugin</artifactId>\n              <version>3.2.2</version>\n              <configuration>\n                  <warSourceDirectory>src/main/webapp</warSourceDirectory>\n                  <warName>ROOT</warName>\n                  <failOnMissingWebXml>false</failOnMissingWebXml>\n              </configuration>\n          </plugin>\n          <!-- ... -->\n       <plugins>\n    </pluginManagement>\n</build>\n
Run Code Online (Sandbox Code Playgroud)\n

我认为没有必要,但只是为了避免任何问题,调整你的 Final 的名称build

\n
<finalName>ROOT</finalName>\n
Run Code Online (Sandbox Code Playgroud)\n

最后,正如Spring 文档中所指出的,请确保您的MyProjectApplication- 我假设此类是您的主要入口点子类SpringBootServletInitializer并相应地重写configure,例如:

\n
@SpringBootApplication\npublic class MyProjectApplication extends SpringBootServletInitializer {\n\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(MyProjectApplication.class);\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(MyProjectApplication.class, args);\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请随时根据您的具体用例调整课程。

\n

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

\n

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

\n
mvn clean package\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

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

\n

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

\n

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

\n

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

\n

context.xml应该类似于:

\n
<?xml version="1.0" encoding="UTF-8"?> \n<Context path="/"> \n\n  <Resource name="jdbc/myDS" \n    type="javax.sql.DataSource"\n    maxActive="100" \n    maxIdle="30" \n    maxWait="10000" \n    url="jdbc:mysql://localhost:3306/myds" \n    driverClassName="com.mysql.jdbc.Driver" \n    username="root" \n    password="secret" \n  /> \n\n</Context>\n
Run Code Online (Sandbox Code Playgroud)\n