当前位置: 首页 > 知识库问答 >
问题:

将CodeStar Spring MVC项目更改为Spring Boot

狄子真
2023-03-14

我有一个Spring Boot项目,在IDE中运行时效果非常好。我想通过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关联的配置时,应用程序会中断。当试图到达网址时,我得到一个带有描述的404错误:

源服务器没有找到目标资源的当前表示形式,或者不愿意透露目标资源是否存在。

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

该消息似乎已连接到web资源。我在文件夹资源和webapp/resources中都有我的web资源。Spring Boot不需要任何位置配置,对吗?默认情况下,它使用此位置。

有人能告诉我要删除什么,要添加什么才能使用我现有的Spring Boot项目吗?

编辑:

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

这是我的Spring Boot项目结构:

共有1个答案

曾元忠
2023-03-14

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

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

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

首先,如您共享的GitHub链接所示,请确保您的项目中包含以下文件。AWS部署架构体系需要它们:

  • appspec。yml
  • buildspec。yml
  • 模板。yml
  • 模板配置。json
  • 整个脚本目录

请根据您的具体需求调整任何必要的配置,尤其是,模板配置。json

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

请确保将包装指示为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中排除Tomcat依赖项。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>
  </exclushtml" target="_blank">ions>
</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>

我不认为有必要,但只是为了避免任何问题,调整您的最终代码<代码>

<finalName>ROOT</finalName>

最后,正如Spring留档所指出的,请确保您的MyProjectApplication-我假设这个类是您的主要切入点子类SpringBootServletSynalizer,并相应地重写配置,如:

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

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

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

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

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

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

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

这个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>
 类似资料:
  • 问题内容: 我从SVN中签出了一个项目,但未指定项目类型,因此它作为“默认”项目签出。快速将其转换为“ Java”项目的最简单方法是什么? 我正在使用Eclipse版本3.3.2。 问题答案: **打开.project文件,然后添加Java性质和构建器。 在.classpath中,引用Java库: **

  • 首先,我使用的是Ubuntu12.04,Eclipse Juno和maven 3.0.4(m2eclipse),我必须在一个从SVN存储库中获得的遗留项目中工作。

  • 问题内容: 我在Eclipse上使用maven2创建了一个项目。添加hibernate-annotations依赖项后,我尝试使用hibernate注释(@ Entity,@ Table …)创建一个类,但这给了我这个错误: 将项目合规性和JRE更改为1.5 我已修复它,但只要我的jdk为1.6,就无法理解为什么需要此设置。 预先感谢! 问题答案: 检查maven编译器插件的设置是否也设置为1.5

  • 因此,我有一个标准的,它获取帖子列表并向用户显示。我的问题是,当用户进入活动时,我希望能够将焦点更改为特定的帖子。 例如,用户A看到他收到一个通知,表示有人喜欢他/她的帖子。他/她单击该通知,它将加载用户帖子的活动,然后焦点将更改为用户喜欢的帖子的位置。 我使用意图将传递给活动。然后,我运行,并尝试查看帖子的ID是否与我通过intent发送的

  • 我想能够调试我的ASP。NET MVC应用程序在本地主机以外的域以及任何子域上,换句话说: http://domain.devhttp://*。领域发展 我尝试了以下方法: 修改主机文件 为*添加主机记录。领域返回127.0.0.1的开发人员 更改项目属性中的“项目Url” 然而,什么都不起作用。当我开始调试时,我得到一个页面,上面写着“服务不可用”或“无效的网址”。 我错过了什么? p、 我正在

  • 在选择我的treeview时遇到问题。其思想是,用户单击该项,然后将数据添加到他们选择的节点下 似乎所选项目是一个文本块,我似乎找不到一种方法将其作为treeview项目来添加节点。 是的,我对这种编程很陌生。 感谢您提供的任何帮助。