1

我正在尝试在 Heroku 上部署我的 Grails 3 应用程序。

我已经参考了这个博客,并遵循了每一步,但是当我尝试运行git push heroku master命令时,会产生以下输出。

remote:        FAILURE: Build failed with an exception.
remote:        
remote:        * What went wrong:
remote:        Task 'stage' not found in root project 'build_6ce46a3ec9d8cecee177ef2d3589c9f1'.
remote:        
remote:        * Try:
remote:        Run gradlew tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
remote:        
remote:        BUILD FAILED
remote:        
remote:        Total time: 1 mins 2.541 secs
remote: 
remote:  !     ERROR: Failed to run Gradle!
remote:        It looks like your project does not contain a 'stage' task, which Heroku needs in order
remote:        to build your app. Our Dev Center article on preparing a Gradle application for Heroku
remote:        describes how to create this task:
remote:        https://devcenter.heroku.com/articles/deploying-gradle-apps-on-heroku
remote:        
remote:        If you're stilling having trouble, please submit a ticket so we can help:
remote:        https://help.heroku.com
remote:        
remote:        Thanks,
remote:        Heroku
remote: 
remote:  !     Push rejected, failed to compile Gradle app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !   Push rejected to employeedatabase.
remote: 

因此,根据输出,我参考了 Heroku 提供的这篇文章并进行了一些更改。现在,每当我尝试运行该命令./gradlew stage时,一切正常,但是当我尝试使用heroku local web以下输出在本地运行 heroku 应用程序时。

[WARN] No ENV file found
10:14:18 PM web.1 |  Expanding EmployeeDatabase-0.1.war into /home/ankit/Desktop/Causecode/EmployeeDatabase/build/target/tomcat.5000/webapps/expanded
10:14:18 PM web.1 |  Adding Context  for /home/ankit/Desktop/Causecode/EmployeeDatabase/build/target/tomcat.5000/webapps/expanded
10:14:19 PM web.1 |  Apr 09, 2017 10:14:19 PM org.apache.coyote.AbstractProtocol init
10:14:19 PM web.1 |  INFO: Initializing ProtocolHandler ["http-nio-5000"]
10:14:19 PM web.1 |  Apr 09, 2017 10:14:19 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
10:14:19 PM web.1 |  INFO: Using a shared selector for servlet write/read
10:14:19 PM web.1 |  Apr 09, 2017 10:14:19 PM org.apache.catalina.core.StandardService startInternal
10:14:19 PM web.1 |  INFO: Starting service Tomcat
10:14:19 PM web.1 |  Apr 09, 2017 10:14:19 PM org.apache.catalina.core.StandardEngine startInternal
10:14:19 PM web.1 |  INFO: Starting Servlet Engine: Apache Tomcat/8.0.30
10:14:19 PM web.1 |  Apr 09, 2017 10:14:19 PM org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
10:14:19 PM web.1 |  INFO: No global web.xml found
10:14:28 PM web.1 |  Apr 09, 2017 10:14:28 PM org.apache.jasper.servlet.TldScanner scanJars
10:14:28 PM web.1 |  INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
10:14:29 PM web.1 |  Apr 09, 2017 10:14:29 PM org.apache.catalina.core.ApplicationContext log
10:14:29 PM web.1 |  INFO: 2 Spring WebApplicationInitializers detected on classpath
10:14:33 PM web.1 |  Exception in thread "main" org.apache.catalina.LifecycleException: Failed to start component [StandardServer[-1]]
10:14:33 PM web.1 |     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
10:14:33 PM web.1 |     at org.apache.catalina.startup.Tomcat.start(Tomcat.java:344)
10:14:33 PM web.1 |     at webapp.runner.launch.Main.main(Main.java:261)
10:14:33 PM web.1 |  Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Tomcat]]
10:14:33 PM web.1 |     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
10:14:33 PM web.1 |     at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:769)
10:14:33 PM web.1 |     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
10:14:33 PM web.1 |     ... 2 more
10:14:33 PM web.1 |  Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat]]
10:14:33 PM web.1 |     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
10:14:33 PM web.1 |     at org.apache.catalina.core.StandardService.startInternal(StandardService.java:441)
10:14:33 PM web.1 |     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
10:14:33 PM web.1 |     ... 4 more
10:14:33 PM web.1 |  Caused by: org.apache.catalina.LifecycleException: A child container failed during start
10:14:33 PM web.1 |     at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:924)
10:14:33 PM web.1 |     at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
10:14:33 PM web.1 |     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
10:14:33 PM web.1 |     ... 6 more
[DONE] Killing all processes with signal  null
10:14:33 PM web.1 Exited with exit code 1

这是我的 Procfile:

web: cd build ; java -Dgrails.env=prod -jar ../build/server/webapp-runner-*.jar --expand-war --port $PORT libs/*.war

这是我的build.gradle

buildscript {
    ext {
        grailsVersion = project.grailsVersion
    }
    repositories {
        mavenLocal()
        maven { url "https://repo.grails.org/grails/core" }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
        classpath "com.bertramlabs.plugins:asset-pipeline-gradle:2.8.2"
        classpath "org.grails.plugins:hibernate4:5.0.10"
    }
}

plugins {
    id "io.spring.dependency-management" version "0.4.0.RELEASE"
}

version "0.1"
group "employeedatabase"

apply plugin: "spring-boot"
apply plugin:"eclipse"
apply plugin:"idea"
apply plugin:"war"
apply plugin:"org.grails.grails-web"
apply plugin:"org.grails.grails-gsp"
apply plugin:"asset-pipeline"

ext {
    grailsVersion = project.grailsVersion
    gradleWrapperVersion = project.gradleWrapperVersion
}

repositories {
    mavenLocal()
    maven { url "https://repo.grails.org/grails/core" }
}

dependencyManagement {
    imports {
        mavenBom "org.grails:grails-bom:$grailsVersion"
    }
    applyMavenExclusions false
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-logging"
    compile "org.springframework.boot:spring-boot-autoconfigure"
    compile "org.grails:grails-core"
    compile "org.springframework.boot:spring-boot-starter-actuator"
    compile "org.springframework.boot:spring-boot-starter-tomcat"
    compile "org.grails:grails-dependencies"
    compile "org.grails:grails-web-boot"
    compile "org.grails.plugins:cache"
    compile "org.grails.plugins:scaffolding"
    compile "org.grails.plugins:hibernate4"
    compile "org.hibernate:hibernate-ehcache"
    console "org.grails:grails-console"
    profile "org.grails.profiles:web"
    runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.8.2"

    runtime 'org.postgresql:postgresql:9.4-1201-jdbc4'
    provided "org.springframework.boot:spring-boot-starter-tomcat"

    //runtime "com.h2database:h2"
    runtime "mysql:mysql-connector-java:5.1.29"
    testCompile "org.grails:grails-plugin-testing"
    testCompile "org.grails.plugins:geb"
    testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
    testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"

    compile 'org.eclipse.jetty:jetty-runner:9.2.11.v20150529'
    compile 'com.github.jsimone:webapp-runner:8.0.30.2'

    //adding spring security core plugin
    compile 'org.grails.plugins:spring-security-core:3.0.3'
    //adding oauth plugin
    compile 'org.grails.plugins:oauth:3.0.1'
}

assets {
    minifyJs = true
    minifyCss = true
}

task wrapper(type: Wrapper) {
    gradleVersion = gradleWrapperVersion
}

task stage() {
    dependsOn clean, war
}
tasks.stage.doLast() {
    delete fileTree(dir: "build/distributions")
    delete fileTree(dir: "build/assetCompile")
    delete fileTree(dir: "build/distributions")
    delete fileTree(dir: "build/libs", exclude: "*.war")
}
war.mustRunAfter clean

task copyToLib(type: Copy) {
    into "$buildDir/server"
    from(configurations.compile) {
        include "webapp-runner*"
    }
}

stage.dependsOn(copyToLib)

我正在使用 Grails 3.1.10。如果您已经在 Heroku 上成功部署了 Grails 3 应用程序,那么一步一步的方法将是无价的。

4

1 回答 1

0

我对 Heroku 没有任何经验,但我在您的build.gradle. 您提到的在 Heroku 上运行 Grails 3 应用程序的文档链接要求您将两个依赖项添加到您的build.gradle

runtime 'postgresql:postgresql:8.4-702.jdbc3'
provided "org.springframework.boot:spring-boot-starter-tomcat"

但是依赖项org.springframework.boot:spring-boot-starter-tomcat已经存在于您build.gradle的范围内compile,因此存在重复的依赖项。

org.springframework.boot:spring-boot-starter-tomcat是 Grails 3 中提供的嵌入式 tomcat,如果您要在独立 tomcat 上部署,则必须删除它,否则如果您在嵌入式 tomcat 中运行 WAR,将有两个 tomcat 实例,我认为您的错误就是全部。

根据文档

请注意,默认情况下,Grails 将在 WAR 文件中包含可嵌入版本的 Tomcat,如果您部署到不同版本的 Tomcat,这可能会导致问题。如果您不打算使用嵌入式容器,那么您应该在部署到 build.gradle 中的生产容器之前将 Tomcat 依赖项的范围更改为提供:

provided "org.springframework.boot:spring-boot-starter-tomcat"

所以考虑删除线compile "org.springframework.boot:spring-boot-starter-tomcat"

于 2017-04-10T16:42:36.273 回答