无法将Simple Spring MVC项目部署到AWS Tomcat 8

时间:2015-12-29 16:28:49

标签: java spring spring-mvc tomcat gradle

我最近正在开始一个新的Java Web项目,并正在尝试广受好评的Spring MVC框架。我使用Java servlet的编码经验大约是在6年前,所以我有点生疏了。经过2天的研究和测试,我未能将简单的Hello World应用程序(使用Gradle构建)部署到测试云(使用Linux和Tomcat 8的AWS Elastic Beanstalk)。更重要的是,根据我在网上找到的所有文件,我无法理解事情的真实联系。

以下是一些我无法找到明确答案的问题:

  1. 如何确定我应该在build.gradle中包含哪些Spring框架依赖项?在线示例提出了不同的建议。目前我的依赖项设置是

    dependencies {
        compile 'org.springframework:spring-context:4.2.4.RELEASE'
        compile 'org.aspectj:aspectjrt:1.7.4'
        compile 'ch.qos.logback:logback-classic:1.1.3'
        compile 'javax.servlet:jstl:1.2'
    }
    

    我的源文件只有两个简单的Java文件:

    {project_root} /src/main/java/test/Greeter.java

    package test;
    
    public class Greeter {
      public String sayHello() {
        return "Hello world!";
      }
    }
    

    {project_root} /src/main/java/test/HelloWorld.java

    package test;
    
    public class HelloWorld {
        public static void main(String[] args) {
            Greeter greeter = new Greeter();        
            System.out.println(greeter.sayHello());
        }
    }
    
    到目前为止,gradle build是成功的。

  2. 我应该在哪里存储我的JSP文件(视图)?

  3. 我应该如何配置web.xml以及告诉Tomcat文件所在位置所需的任何其他XML?我应该在哪里存储这些XML?

  4. 我应该如何配置build.gradle来编译一个.war文件,该文件具有在Tomcat上运行我的Spring Web应用程序所需的所有资源?我目前的build.gradle如下:

    apply plugin: 'java'
    apply plugin: 'war'
    
    
    repositories {
        mavenLocal()
        mavenCentral()
    }
    
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    war {
        version = '0.4'
        baseName = 'collaborative-system'
    }  
    project.webAppDirName = 'webapp'
    
    dependencies {
        compile 'org.springframework:spring-context:4.2.4.RELEASE'
        compile 'org.aspectj:aspectjrt:1.7.4'
        compile 'ch.qos.logback:logback-classic:1.1.3'
        compile 'javax.servlet:jstl:1.2'
    }
    
    sourceSets {
        main {
            java {
                srcDir 'src'
            }
        }
    }
    
    
    task wrapper(type: Wrapper) {
        gradleVersion = '2.3'
    }
    
  5. 服务器现在显示404页面,其中构建了.war文件。

2 个答案:

答案 0 :(得分:1)

对Spring Framework和Spring Boot必须有一些理解:

  1. Spring Boot是一个可以轻松创建基于Spring的应用程序的工具。它可以帮助您包含所需的所有依赖项,自动配置项目,嵌入一个servlet容器,如Tomcat,Jetty等。简而言之,它可以帮助您启动而无需配置所有内容。对于初学者来说,这几乎是必须的。 (感谢@chrylis的建议。)

  2. .jar文件是一个独立的可执行版本。 Spring Boot使您可以轻松运行应用程序,而无需在计算机上配置servlet。 Spring文档声明:

      

    这个jar很方便,因为它包含所有其他依赖项和诸如归档中的Web服务器之类的东西。你可以给任何人这个.jar,他们可以毫不费力地运行你的整个Spring应用程序:不需要构建工具,没有设置,没有web服务器配置等:只是java -jar ... your.jar。

  3. 如果您需要像我一样将应用程序部署到外部servlet(例如,用于AWS),则必须构建.war文件。 .war.jar之间的区别在于.war不包含嵌入式容器依赖项,因此允许您自己的servlet容器执行应用程序。要将.jar转换为.war,请按照以下指南操作:https://spring.io/guides/gs/convert-jar-to-war/

  4. 通过构建.war文件,您还需要配置以告诉您自己的servlet容器在startUp上运行哪个类。传统上,我们使用web.xml但是对于servlet 3.0+,Spring已将其替换为SpringBootServletInitializer。它是一个方便的类,将您的应用程序绑定到servlet。只需执行以下操作:

    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    
    public class ServletInitializer extends SpringBootServletInitializer {
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
           return application.sources(SpringBootAwsApplication.class);
       }
    }
    

    SpringBootAwsApplication是包含public static void main(String[] args)方法的主类。

  5. 我建议任何遇到Spring Boot问题的人 SOLELY 参考官方文档:http://docs.spring.io/spring-boot/docs/1.3.2.BUILD-SNAPSHOT/reference/html/。仅当您无法在文档中找到相关信息时,请在线参考其他示例。

    希望这有助于某人。

答案 1 :(得分:0)

您没有提供足够的信息。我猜想,一旦你部署了.war文件,你就试图访问它:

http://localhost:8080/collaborative-system/viewname

假设这是正确的,您必须记住,您需要一个正确注释的Controller类,并返回一个与您在WEB-INF/jsp/文件夹中的视图名称相匹配的字符串。如果你不这样做,那么它根本就不是一个Spring项目。