在Heroku上运行使用gradle构建的Spring应用程序

时间:2014-10-15 18:34:14

标签: java spring heroku deployment gradle

我在使用Gradle构建的Spring应用程序时遇到问题。应用程序包括MongoDB(来自Heroku的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());
    }
}

在使用gradle将buildpack更改为one之后,我使用MongoHQ Sandbox在Heroku免费帐户上推送了所有内容。

但是在尝试通过网络浏览器运行我的应用后,我收到了此错误:

  

应用程序中发生错误,无法提供您的页面。请稍后再试。

     

如果您是应用程序所有者,请查看日志以获取详细信息。

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 = error code = H10 desc =" App崩溃" method = GET path =" /"主机= 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 = error code = H10 desc =" App崩溃" method = GET path =" /favicon.ico"主机= 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 = error code = H10 desc =" App崩溃" method = GET path =" /"主机= 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'])

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:19)

在评论中进行简短讨论后(根据this说明),您需要将以下任务添加到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文件。完成后,输出jar将被复制到project.rootDir并重命名为app.jar。它保证它始终具有相同的名称,并且可以使用Procfile中的命令轻松运行。 stage任务还取决于clean(其中包含删除app.jar的其他操作)和build(构建应用)。设置stage.mustRunAfter(clean)非常重要,否则将无法确定任务运行的顺序(现在可能会发生这种情况 - 在本地检查)。我的意思是,如果只指定了dependsOn build可以运行,那么clean,最后stage - 并且不会创建任何内容。我希望它很清楚。

答案 1 :(得分:4)

我做了一个例子,所以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()
}

如果gradlewgradlew.bat不在您的主项目目录中或者不是最新的,那么在cmd中运行命令gradle wrapper

如果您的计算机上没有实际安装Gradle,请从主gradle网站安装。

我在github上的例子如下。 https://github.com/arose13/Heroku-Spring-Gradle_Example