Недавно я начал новый веб-проект Java и пробую хорошо зарекомендовавшую себя Spring MVC Framework. Мой опыт программирования с сервлетом Java датируется примерно 6 лет назад, так что я немного заржавел. После двух дней изучения и тестирования мне не удалось развернуть простое приложение Hello World (созданное с помощью Gradle) в тестовом облаке (AWS Elastic Beanstalk с Linux и Tomcat 8). Что еще более важно, я не могу понять, как вещи действительно связаны, учитывая все документы, которые я нашел в Интернете.

Вот несколько вопросов, на которые я не смог найти однозначных ответов:

  1. Как мне решить, какие зависимости Spring framework я должен включить в свой build.gradle? Примеры в Интернете предлагают разные вещи. В настоящее время мои настройки зависимостей

    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 пока успешна.

  2. Где мне хранить файлы JSP (представления)?

  3. Как мне настроить web.xml и любые другие XML-файлы, которые требуются, чтобы сообщить Tomcat, где находятся файлы? Где мне хранить эти XML?

  4. Как мне настроить build.gradle для компиляции файла .war, в котором есть все ресурсы, необходимые для запуска моего веб-приложения Spring на Tomcat? Мой текущий 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'
    }
    

Сервер теперь показывает страницу 404 с созданным файлом .war.

0
tropicalfish 29 Дек 2015 в 19:28

2 ответа

Лучший ответ

Некоторое понимание, которое необходимо иметь в отношении Spring Framework и Spring Boot:

  1. Spring Boot - это инструмент, который упрощает создание приложений на основе Spring. Он помогает вам включить все необходимые зависимости, автоматически настроить ваш проект, встроить контейнер сервлетов, такой как Tomcat, Jetty и т. Д. Короче говоря, он помогает вам начать работу без необходимости настраивать все. Для новичков это почти обязательно. (Благодаря предложению @chrylis).

  2. Файл .jar - это автономная исполняемая сборка. Spring Boot позволяет легко запускать ваше приложение без необходимости настраивать сервлет на вашем компьютере. В документации Spring говорится:

    Этот jar-файл удобен, потому что он включает в себя все другие зависимости и вещи, такие как ваш веб-сервер, внутри архива. Вы можете дать кому угодно этот файл .jar, и он сможет без проблем запустить все ваше приложение Spring: не требуется никаких инструментов для сборки, настройки, конфигурации веб-сервера и т. Д.: Просто java -jar ... your.jar.

  3. Если вам нужно развернуть приложение на внешнем сервлете, как это делаю я (например, на AWS), вам нужно будет создать файл .war. Разница между .war и .jar состоит в том, что .war не включает встроенную зависимость контейнера, что позволяет вашему собственному контейнеру сервлетов выполнять приложение. Чтобы преобразовать .jar в .war, следуйте этому руководству: https://spring.io/guides/gs/convert-jar-to-war/

  4. Создавая файл .war, вам также нужна конфигурация, чтобы указать вашему собственному контейнеру сервлетов, какой класс запускать при запуске. Традиционно мы используем web.xml, но для сервлета 3.0+ Spring заменил его на SpringBootServletInitializer. Это удобный класс, который связывает ваше приложение с сервлетом. Просто сделайте следующее:

    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).

Я рекомендую всем, у кого возникают проблемы с Spring Boot, ИСКЛЮЧИТЕЛЬНО обратиться к официальной документации: http://docs.spring.io/spring-boot/docs/1.3.2.BUILD-SNAPSHOT/reference/html/. Обратитесь к другим примерам в Интернете, только если вы не можете найти соответствующую информацию в документации.

Надеюсь, это кому-то поможет.

1
tropicalfish 30 Дек 2015 в 16:53

Вы даете недостаточно информации. Я собираюсь предположить, что после того, как вы развернули свой файл .war, вы попытались получить к нему доступ по адресу:

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

Предполагая, что это правильно, вы должны иметь в виду, что вам нужен класс Controller, который правильно аннотирован и возвращает строку, которая соответствует имени представления, которое у вас есть в папке WEB-INF/jsp/. Если вы этого не сделаете, то это вообще не проект Spring.

0
djangofan 29 Дек 2015 в 17:05