For*_*rin 14 java deployment spring heroku 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());
}
}
Run Code Online (Sandbox Code Playgroud)
在使用gradle将buildpack更改为one之后,我使用MongoHQ Sandbox在Heroku免费帐户上推送了所有内容.
但在尝试通过Web浏览器运行我的应用程序后,我收到此错误:
应用程序中发生错误,无法提供您的页面.请稍后重试.
如果您是应用程序所有者,请检查日志以获取详细信息.
heroku logs 给我这个输出:
2014-10-15T18:19:30.293964 + 00:00 heroku [web.1]:用命令启动进程
java -Xmx384m -Xss512k -XX:+UseCompressedOops -jar build/libs/*.jar2014-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 crashed"method = 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 = error code = H10 desc ="App crashed"method = 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 = error code = H10 desc ="App crashed"method = 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'])
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
Opa*_*pal 20
在评论中进行简短讨论之后(根据此说明),您需要将以下任务添加到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()
}
Run Code Online (Sandbox Code Playgroud)
而且内容Procfile将是:
web: java $JAVA_OPTS -jar app.jar
Run Code Online (Sandbox Code Playgroud)
现在它应该工作正常.
说明:
任务stage准备要运行的jar文件.完成后,输出jar被复制并重project.rootDir命名为app.jar.它保证它将始终具有相同的名称,并且可以使用命令轻松运行Procfile.stage任务还取决于clean(具有要删除的附加操作app.jar)和build(构建应用程序).设置stage.mustRunAfter(clean)是很重要的,否则运行任务的顺序不确定(这可能现在发生 - 在本地检查).我的意思是,如果just dependsOn指定build可以运行,那么clean最后stage- 并且什么都没有创建.我希望它很清楚.
我做了一个例子,这样新手就可以真正检查并理解每一行代码。因为我真的知道弄清楚这个问题是多么令人沮丧。
这就是你的 Procfile 的样子
web: java $JAVA_OPTS -Dserver.port=$PORT -jar app.jar
Run Code Online (Sandbox Code Playgroud)
这就是你的 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()
}
Run Code Online (Sandbox Code Playgroud)
如果gradlew和gradlew.bat不在您的主项目目录中或者不是最新的,则在 cmd 中运行命令gradle wrapper。
如果您的计算机上实际上没有安装 Gradle,请从主 gradle 网站安装它。
我在 github 上的示例如下。 https://github.com/arose13/Heroku-Spring-Gradle_Example