将 CodeStar Spring MVC 项目更改为 Spring Boot
Change CodeStar Spring MVC project to Spring Boot
我有一个 Spring 引导项目,在 IDE 中 运行 时可以完美运行。我想通过 AWS CodeStar 运行 这个。不幸的是,CodeStar 创建的默认 Spring 模板使用 Spring MVC。
我不能用我的 Spring 引导项目覆盖默认的 Spring MVC 项目(它不起作用)。我可以将我的一些资源复制到 MVC 项目中,例如 index.html,这样就可以了。但是像 Thymeleaf 这样的功能就不起作用了。出于这个和其他原因,我想将提供的 Spring MVC 更改为我已经拥有的 Spring 引导结构。
我按照此处的说明操作:https://www.baeldung.com/spring-boot-migration
不幸的是,这没有帮助。我可以创建应用程序入口点并添加 Spring 启动依赖项,而不会破坏应用程序。但是,当我删除默认依赖项或与 MVC 关联的配置时,应用程序会中断。尝试到达 URL 时,出现 404 错误,描述为:
源服务器没有找到目标资源的当前表示,或者不愿意公开表示存在。
调试此错误消息(例如 https://www.codejava.net/java-ee/servlet/solved-tomcat-error-http-status-404-not-found)没有帮助。
该消息似乎已连接到网络资源。我在文件夹资源中有我的网络资源以及 webapp/resources。而且Spring Boot不需要任何位置配置,对吧?它默认使用此位置。
有人可以告诉我要删除哪些内容以及添加哪些内容以便能够使用我现有的 Spring 引导项目吗?
编辑:
这是 AWS CodeStar Spring Web 应用程序默认模板的 link:https://github.com/JanHorcicka/AWS-codestar-template
这是我的 Spring 引导项目结构:
我知道您曾表示您之前曾尝试使用您的 Spring 引导项目进行一些修改但没有成功,但我认为实际上有可能在 AWS CodeStar 上成功部署您的应用程序,并且它将是我的建议。
我还意识到在您的屏幕截图中包含了几个必需的工件和 classes,但是请仔细检查您在将应用程序部署到 AWS CodeStar 时是否遵循了这些步骤。
让我们从本地 Spring 引导项目 运行 的原始版本开始,不做任何修改,然后执行以下更改。
首先,如您分享的 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>
如有必要,使用某种允许您启动的配置文件应用此排除 Spring 同时在本地和外部 servlet 容器中启动。
接下来,参数化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
- 我假设此 class 是您的主要入口点 subclass 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);
}
}
请随意调整 class 以适应您的具体用例。
使用此设置,尝试部署您的应用程序并查看它是否工作:也许您会发现某种库依赖性问题,但我认为在大多数情况下它应该工作正常。
第一步,您可以尝试在本地部署应用程序的版本,稍后您将按照您在项目模板中提供的说明部署到 AWS CodeStar,基本上,一旦配置了答案中描述的必要更改, 通过 运行:
mvn clean package
并在您的本地 tomcat 环境中部署生成的 war。请 ware 可能 ROOT
应用程序已经存在于标准 tomcat 安装中(您可以通过检查 webapps
文件夹来验证它):您可以覆盖它war 文件。
对于本地测试,您甚至可以选择不同的应用程序名称(在 pom.xml
文件中配置 build.finalName
和 warName
):重要的是验证应用程序是否在本地运行成功。
如果您愿意,可以选择将应用程序直接部署到 AWS CodeStar 并在必要时检查日志。
无论如何,请注意两件事:一方面,如果您在应用程序中配置了任何绝对路径,它可能是您在评论中提到的 404
问题的原因.请确保您的应用程序将部署在 Tomcat 中,上下文根为“/”。
另一方面,检查您是如何配置数据库访问的。
可能你使用了 application.properties
并且没问题,但是请 ware 在使用应用程序时数据库必须是可访问的:也许 Spring 无法创建必要的数据源,并且持久性管理器或与之关联的相关内容,因此应用程序没有启动。同样,这可能是 404
错误代码的原因。
为了简化数据库连接,为了测试,乍一看,我建议您使用简单的属性来配置数据源,即驱动程序 class、连接字符串、用户名和密码。如果该设置工作正常,您可以稍后启用 JNDI 或认为必要的东西。
请记住,如果您需要更改上下文名称 and/or 在 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>
我有一个 Spring 引导项目,在 IDE 中 运行 时可以完美运行。我想通过 AWS CodeStar 运行 这个。不幸的是,CodeStar 创建的默认 Spring 模板使用 Spring MVC。
我不能用我的 Spring 引导项目覆盖默认的 Spring MVC 项目(它不起作用)。我可以将我的一些资源复制到 MVC 项目中,例如 index.html,这样就可以了。但是像 Thymeleaf 这样的功能就不起作用了。出于这个和其他原因,我想将提供的 Spring MVC 更改为我已经拥有的 Spring 引导结构。
我按照此处的说明操作:https://www.baeldung.com/spring-boot-migration
不幸的是,这没有帮助。我可以创建应用程序入口点并添加 Spring 启动依赖项,而不会破坏应用程序。但是,当我删除默认依赖项或与 MVC 关联的配置时,应用程序会中断。尝试到达 URL 时,出现 404 错误,描述为:
源服务器没有找到目标资源的当前表示,或者不愿意公开表示存在。
调试此错误消息(例如 https://www.codejava.net/java-ee/servlet/solved-tomcat-error-http-status-404-not-found)没有帮助。
该消息似乎已连接到网络资源。我在文件夹资源中有我的网络资源以及 webapp/resources。而且Spring Boot不需要任何位置配置,对吧?它默认使用此位置。
有人可以告诉我要删除哪些内容以及添加哪些内容以便能够使用我现有的 Spring 引导项目吗?
编辑:
这是 AWS CodeStar Spring Web 应用程序默认模板的 link:https://github.com/JanHorcicka/AWS-codestar-template
这是我的 Spring 引导项目结构:
我知道您曾表示您之前曾尝试使用您的 Spring 引导项目进行一些修改但没有成功,但我认为实际上有可能在 AWS CodeStar 上成功部署您的应用程序,并且它将是我的建议。
我还意识到在您的屏幕截图中包含了几个必需的工件和 classes,但是请仔细检查您在将应用程序部署到 AWS CodeStar 时是否遵循了这些步骤。
让我们从本地 Spring 引导项目 运行 的原始版本开始,不做任何修改,然后执行以下更改。
首先,如您分享的 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>
如有必要,使用某种允许您启动的配置文件应用此排除 Spring 同时在本地和外部 servlet 容器中启动。
接下来,参数化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
- 我假设此 class 是您的主要入口点 subclass 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);
}
}
请随意调整 class 以适应您的具体用例。
使用此设置,尝试部署您的应用程序并查看它是否工作:也许您会发现某种库依赖性问题,但我认为在大多数情况下它应该工作正常。
第一步,您可以尝试在本地部署应用程序的版本,稍后您将按照您在项目模板中提供的说明部署到 AWS CodeStar,基本上,一旦配置了答案中描述的必要更改, 通过 运行:
mvn clean package
并在您的本地 tomcat 环境中部署生成的 war。请 ware 可能 ROOT
应用程序已经存在于标准 tomcat 安装中(您可以通过检查 webapps
文件夹来验证它):您可以覆盖它war 文件。
对于本地测试,您甚至可以选择不同的应用程序名称(在 pom.xml
文件中配置 build.finalName
和 warName
):重要的是验证应用程序是否在本地运行成功。
如果您愿意,可以选择将应用程序直接部署到 AWS CodeStar 并在必要时检查日志。
无论如何,请注意两件事:一方面,如果您在应用程序中配置了任何绝对路径,它可能是您在评论中提到的 404
问题的原因.请确保您的应用程序将部署在 Tomcat 中,上下文根为“/”。
另一方面,检查您是如何配置数据库访问的。
可能你使用了 application.properties
并且没问题,但是请 ware 在使用应用程序时数据库必须是可访问的:也许 Spring 无法创建必要的数据源,并且持久性管理器或与之关联的相关内容,因此应用程序没有启动。同样,这可能是 404
错误代码的原因。
为了简化数据库连接,为了测试,乍一看,我建议您使用简单的属性来配置数据源,即驱动程序 class、连接字符串、用户名和密码。如果该设置工作正常,您可以稍后启用 JNDI 或认为必要的东西。
请记住,如果您需要更改上下文名称 and/or 在 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>