我意识到您曾表示您之前曾尝试使用您的 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 中的部署所必需的。
确保您指示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>
或排除 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-INF
Web 应用程序根路径中的目录下。
这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>