Запуск приложения Spring, построенного с помощью gradle на Heroku

У меня проблема с моим приложением Spring, созданным с помощью Gradle. Приложение включает MongoDB (MongoHQ от Heroku).

Мне удалось как все нажать на герою, я добавил этот код в свой проект:

@Configuration
public class MongoHQConfiguration {

    public @Bean MongoDbFactory mongoDbFactory() throws MongoException, UnknownHostException {
        return new SimpleMongoDbFactory(new MongoURI(System.getenv("MONGOHQ_URL")));
    }

    public @Bean MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

После изменения buildpacks на один с помощью gradle, я нажал все на бесплатную учетную запись Heroku с помощью SandoHQ Sandbox.

Но после попытки запустить мое приложение через веб-браузер, я получаю эту ошибку:

Произошла ошибка в приложении, и ваша страница не могла быть отправлена. Повторите попытку через несколько минут.

Если вы являетесь владельцем приложения, проверьте свои журналы для деталей.

heroku logs дает мне этот результат:

2014-10-15T18: 19: 30.293964 + 00: 00 heroku [web.1]: запуск с помощью команды java -Xmx384m -Xss512k -XX:+UseCompressedOops -jar build/libs/*.jar

2014-10-15T18: 19: 30.797673 + 00: 00 app [web.1]: Ошибка: невозможно получить доступ к jarfile build/libs/*. jar

2014-10-15T18: 19: 31.474525 + 00: 00 heroku [web.1]: состояние изменено с момента запуска до разбитого

2014-10-15T18: 19: 31.464753 + 00: 00 heroku [web.1]: процесс завершен со статусом 1

2014-10-15T18: 19: 32.577398 + 00: 00 heroku [router]: at = код ошибки = H10 desc = "Ошибка приложения" = GET path = "/" host = tvmaniac.herokuap p.com request_id = 7e8bfe6c-2669-405e-9bce-59fde09f71ef fwd = "89.129.247.185" dyno = connect = service = status = 503 bytes =

2014-10-15T18: 19: 34.016281 + 00: 00 heroku [router]: at = код ошибки = H10 desc = "Ошибка приложения" = GET path = "/favicon.ico" host = tvmani ac.herokuapp.com request_id = 4300386e-dc5c-47ed-9878-0bee87128fc9 fwd = "89.129.247.185" dyno = connect = service = status = 503 bytes =

2014-10-15T18: 19: 41.988204 + 00: 00 heroku [router]: at = код ошибки = H10 desc = "Ошибка приложения" = GET path = "/" host = tvmaniac.herokuap p.com request_id = 436db871-ea8c-428f-8cc7-160c3cb96a2d fwd = "50.16.146.194" dyno = connect = service = status = 503 bytes =

Я думаю, проблема в Procfile, но я понятия не имею, что мне добавить туда, вот мой текущий код:

default_process_types:

web: java $JAVA_OPTS -jar build/libs/*. jar

EDITED

Здесь мой build.gradle:

buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-release" }
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.8.RELEASE")
    }
}    

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

mainClassName = "com.shalastra.tvmaniac.TVManiacConfiguration"

jar {
    baseName = 'tvmaniac'
    version = '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-release" }
    maven { url "http://m2.neo4j.org" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")

    compile("org.springframework.boot:spring-boot-starter-actuator")
    testCompile("junit:junit")

    compile("org.springframework.data:spring-data-rest-webmvc")
    compile("org.springframework.data:spring-data-mongodb")

    compile("com.google.guava:guava:17.0")
    compile("org.apache.commons:commons-lang3:3.3.2")
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.0'
}

task stage(dependsOn: ['clean', 'build', 'installApp'])

Заранее благодарим за помощь.

Ответ 1

После короткой дискуссии в комментариях кажется (согласно этим инструкциям), что вам нужно добавить следующую задачу в файл build.gradle:

task stage(type: Copy, dependsOn: [clean, build]) {
    from jar.archivePath
    into project.rootDir 
    rename {
        'app.jar'
    }
}
stage.mustRunAfter(clean)

clean << {
    project.file('app.jar').delete()
}

И содержимое Procfile будет:

web: java $JAVA_OPTS -jar app.jar

Теперь он должен работать нормально.

Пояснение:

Задача stage готовит файл jar для запуска. После его завершения выходная банка копируется в project.rootDir и переименовывается в app.jar. Он гарантирует, что он будет иметь одно и то же имя и может быть легко запущен командой Procfile. Задача stage также зависит от clean (которая имеет дополнительные действия для удаления app.jar) и build (которая создает приложение). Важно установить stage.mustRunAfter(clean), потому что в противном случае порядок выполнения задач не определен (это, вероятно, происходит сейчас - проверьте его локально). Я имею в виду, что если задано только dependsOn build, тогда clean и, наконец, stage - и ничего не создается. Надеюсь, это ясно.

Ответ 2

Я сделал пример, чтобы noobies действительно могли проверить и понять каждую строку кода. Потому что я действительно знаю, как сложно это понять.

Вот что должно выглядеть ваше Procfile

web: java $JAVA_OPTS -Dserver.port=$PORT -jar app.jar

Вот что должно выглядеть ваш файл Gradle

group 'com.springtest.api'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

//Path to the Main Web Class
mainClassName = "hello.Application"

jar {
    baseName = 'spring-test-api'
    version = '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8

dependencies {
    testCompile 'junit:junit:4.11'

    // Spring Framework
    compile 'org.springframework.boot:spring-boot-starter-web'
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.6'
}

task stage(type: Copy, dependsOn: [clean, build]) {
    from jar.archivePath
    into project.rootDir
    rename {
        'app.jar'
    }
}
stage.mustRunAfter(clean)

clean << {
    project.file('app.jar').delete()
}

Если gradlew и gradlew.bat не находятся в вашей основной директории проекта или не обновлены, то в cmd выполните команду gradle wrapper.

Если у вас нет установленного на вашем компьютере Gradle, установите его с основного веб-сайта Gradle.

Мой пример в github ниже. https://github.com/arose13/Heroku-Spring-Gradle_Example