我正在尝试在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应用程序,那么一步一步的方法将是无价的。
答案 0 :(得分: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实例我认为你的错误就在于此。
根据docs:
请注意,默认情况下,Grails将包含一个可嵌入版本 在WAR文件中使用Tomcat,如果部署到a,这可能会导致问题 不同版本的Tomcat。如果您不打算使用嵌入式 容器,然后您应该更改Tomcat依赖项的范围 在部署到您的生产容器之前提供 的build.gradle:
provided "org.springframework.boot:spring-boot-starter-tomcat"
因此,请考虑删除行compile "org.springframework.boot:spring-boot-starter-tomcat"
。