2014-10-15 19 views
12

Tôi gặp sự cố với ứng dụng Spring được tạo bằng Gradle. Ứng dụng bao gồm MongoDB (MongoHQ từ Heroku).Chạy ứng dụng Spring được xây dựng với gradle trên Heroku

tôi được quản lý như thế nào để đẩy tất cả mọi thứ trên Heroku, tôi đã thêm mã này vào dự án của tôi:

@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()); 
    } 
} 

Sau khi thay đổi buildpacks để một với gradle, tôi đẩy tất cả mọi thứ trên Heroku tài khoản miễn phí với MongoHQ Sandbox.

Nhưng sau khi cố gắng chạy ứng dụng của mình thông qua trình duyệt web, tôi nhận được lỗi này:

An error occurred in the application and your page could not be served. Please try again in a few moments.

If you are the application owner, check your logs for details.

heroku logs mang lại cho tôi kết quả này:

2014-10-15T18:19:30.293964+00:00 heroku[web.1]: Starting process with command java -Xmx384m -Xss512k -XX:+UseCompressedOops -jar build/libs/*.jar

2014-10-15T18:19:30.797673+00:00 app[web.1]: Error: Unable to access jarfile build/libs/*.jar

2014-10-15T18:19:31.474525+00:00 heroku[web.1]: State changed from starting to crashed

2014-10-15T18:19:31.464753+00:00 heroku[web.1]: Process exited with status 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=

Tôi nghĩ rằng vấn đề là ở Procfile, nhưng tôi không biết nên thêm gì ở đây, đây là mã hiện tại của tôi:

default_process_types:

web: java $JAVA_OPTS -jar build/libs/*.jar

EDITED

Dưới đây là build.gradle tôi:

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']) 

Cảm ơn trước sự giúp đỡ của bạn.

+0

Tại sao bạn không thêm tác vụ sao chép tạo phẩm được tạo từ 'build/lib' sang' project.rootDir' (đổi tên nó một cách thích hợp) và bắt đầu ứng dụng từ thư mục gốc? Có vẻ như không có cái bình nào được xây dựng. – Opal

+0

Bạn có thể giải thích cách tôi có thể làm được không? – Forin

+0

Tôi sẽ thêm phản hồi sau một phút. – Opal

Trả lời

18

Sau một cuộc thảo luận ngắn trong ý kiến ​​có vẻ như (theo this hướng dẫn) mà bạn cần thêm các nhiệm vụ sau đây để build.gradle file:

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() 
} 

Và nội dung của Procfile sẽ là:

web: java $JAVA_OPTS -jar app.jar 

Bây giờ nó sẽ hoạt động tốt.

Giải thích:

Nhiệm vụ stage chuẩn bị tệp jar để chạy. Sau khi hoàn thành, lọ đầu ra được sao chép vào project.rootDir và đổi tên thành app.jar. Nó đảm bảo rằng nó sẽ luôn có cùng tên và có thể dễ dàng chạy với lệnh từ Procfile. Nhiệm vụ stage cũng tùy thuộc vào clean (có hành động bổ sung để xóa app.jar) và build (trong đó xây dựng ứng dụng). Điều quan trọng là đặt stage.mustRunAfter(clean) bởi vì nếu không thứ tự mà tác vụ được chạy không được xác định (điều này có thể xảy ra ngay bây giờ - hãy kiểm tra tại địa phương). Ý tôi là nếu chỉ dependsOn được chỉ định build có thể chạy, sau đó clean và cuối cùng là stage - và không có gì được tạo. Tôi hy vọng nó rõ ràng.

+0

ok, nó có vẻ ok, nhưng bây giờ tôi nhận được kết quả này: [http://pastebin.com/ndKciqye] – Forin

+0

dán bin này đã bị xóa. – Opal

+0

http://pastebin.com/3iX9NsEr bây giờ là ok – Forin

4

Tôi đã thực hiện một ví dụ để các người dùng thực sự có thể kiểm tra và hiểu mọi dòng mã. Bởi vì tôi thực sự biết làm thế nào bực bội này có thể được để tìm ra.

Đây là những gì Procfile của bạn sẽ trông như thế

web: java $JAVA_OPTS -Dserver.port=$PORT -jar app.jar 

Đây là những gì tập tin Gradle của bạn sẽ trông như thế

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() 
} 

Nếu gradlewgradlew.bat đang không ở trong thư mục chính của dự án của bạn hay là không cập nhật sau đó trong cmd chạy lệnh gradle wrapper.

Nếu bạn không có Gradle thực sự được cài đặt trên máy tính của bạn cài đặt nó từ trang web gradle chính.

Ví dụ của tôi về github ở bên dưới. https://github.com/arose13/Heroku-Spring-Gradle_Example

+1

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – ChipsLetten

+1

Kk nhờ bro tôi sẽ làm điều đó tại – SARose

+1

này nên là gradle chính thức dụ springboot Heroku, không phải một số mơ hồ hướng dẫn trên trang web chính thức của họ: https://devcenter.heroku.com/articles/deploying-gradle-apps-on- heroku +1 – Simon

Các vấn đề liên quan