在Heroku上运行使用gradle构建的Spring应用程序
我使用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
启动进程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 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'])
在此先感谢您的帮助。
在评论中进行简短讨论之后(根据此说明),您需要将以下任务添加到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
命名为app.jar
。 它保证它始终具有相同的名称,并且可以使用Procfile
的命令轻松运行。 stage
任务还取决于clean
(有一个额外的动作来删除app.jar
)和build
(构建应用程序)。 设置stage.mustRunAfter(clean)
非常重要,否则将无法确定运行任务的顺序(这可能现在发生 - 在本地检查)。 我的意思是,如果只是dependsOn
指定build
可以运行,然后clean
,最后stage
- 并没有创建任何东西。 我希望它很清楚。
我已经做了一个例子,所以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() }
如果gradlew
和gradlew.bat
不在主项目目录中或者不是最新的,那么在cmd中运行命令gradle wrapper
。
如果您的计算机上没有实际安装Gradle,请从主gradle网站安装。
我在github上的例子如下。 https://github.com/arose13/Heroku-Spring-Gradle_Example
- gradle中的传递文件依赖项
- 如何通过在gradle命令行上传递version属性来设置project.version?
- Gradle Build失败并出现exception:java.exe’以非零退出值2结束
- 我仍然可以使用eclipse进行Android项目吗?
- 使用Gradle的Spring Boot多模块项目无法构建
- Gradle子项目未包含在类路径中
- React-native build error Android – java.lang.UnsupportedClassVersionError:com / android / build / gradle / AppPlugin:不支持的major.minor版本52.0
- 使用Eclipse在Gradle中选择正确的JRE版本
- 运行jacocoReport