grails - 无法在Heroku上部署我的Grails 3应用

标签 grails heroku gradle spring-boot grails3

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

我已经引用了this blog,并遵循了每个步骤,但是当我尝试运行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提供的this文章并进行了一些更改。
现在,每当我尝试运行./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应用程序,那么分步方法将是无价的。

最佳答案

我没有使用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实例,我认为您的错误全是关于。

根据docs:

Note that by default Grails will include an embeddable version of Tomcat inside the WAR file, this can cause problems if you deploy to a different version of Tomcat. If you don’t intend to use the embedded container then you should change the scope of the Tomcat dependencies to provided prior to deploying to your production container in build.gradle:

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


因此,请考虑删除compile "org.springframework.boot:spring-boot-starter-tomcat"行。

关于grails - 无法在Heroku上部署我的Grails 3应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43309530/

相关文章:

java - 使用证书身份验证将 Grails 配置为 POST

grails - 没有Domain类的实际运行中的Grails <g:paginate>(索引)

Heroku 上的 Ruby 守护进程

heroku - 为什么我从 Heroku Redis 间歇性地得到 "OpenSSL::SSL::SSLError: SSL_read: sslv3 alert bad record mac"?

android - 与 Android 和桌面项目共享 Kotlin 模块

datetime - Grails-如果少于10分钟,则比较Groovy日期时间

grails - 在Grails的TagLib中使用request.getSession(false)会引发异常

java - 驱动程序 :org. postgresql.Driver@3ed03652 为 URL 返回 null ... 在将 spring boot 部署到 Heroku 时

android studio 无法解析 : runner and failed to resolve: espresso-core and failed to resolve: monitor

android - Android Studio Java编译器错误和AAPT2错误