2014-10-15 6 views
12

Ich habe ein Problem mit meiner Spring-Anwendung mit Gradle gebaut. Die App enthält MongoDB (MongoHQ von Heroku).Running Spring App gebaut mit Gradle auf Heroku

ich es geschafft, wie alles auf Heroku zu drücken, habe ich diesen Code zu meinem Projekt hinzugefügt:

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

Nach buildpacks einem mit gradle, ich schob alles auf Heroku kostenloses Konto mit MongoHQ Sandbox zu ändern.

Aber nach dem Versuch, meine App über Web-Browser ausgeführt werden, erhalte ich diese Fehlermeldung:

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 gibt mir diese Ausgabe:

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=

Ich denke, das Problem in procfile ist, aber ich habe keine Ahnung, was ich da hinzufügen soll, hier ist mein aktueller Code:

default_process_types:

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

EDITED

Hier ist mein 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']) 

Vielen Dank im Voraus für Ihre Hilfe.

+0

Warum fügen Sie keine Aufgabe hinzu, die das erstellte Artefakt von 'build/lib' nach' project.rootDir' kopiert (umbenannt wird) und die Anwendung vom Stammverzeichnis aus startet? Es scheint, dass kein Glas gebaut wurde. – Opal

+0

Können Sie mir erklären, wie ich das machen kann? – Forin

+0

Ich werde eine Antwort in einer Minute hinzufügen. – Opal

Antwort

18

Nach einer kurzen Diskussion in den Kommentaren es (nach this Anweisungen) scheint, dass Sie benötigen die folgende Aufgabe zu build.gradle Datei hinzufügen:

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

und der Gehalt an Procfile wird:

web: java $JAVA_OPTS -jar app.jar 

Jetzt sollte es gut funktionieren.

Erläuterung:

Aufgabe stage bereitet JAR-Datei ausgeführt werden. Nachdem es fertig ist, wird das Ausgabe-Jar in project.rootDir kopiert und in app.jar umbenannt. Es garantiert, dass es immer den gleichen Namen hat und leicht mit dem Befehl von Procfile ausgeführt werden kann. stage Aufgabe hängt auch von clean (die eine zusätzliche Aktion hat, um app.jar zu entfernen) und build (die die App erstellt). Es ist wichtig, stage.mustRunAfter(clean) zu setzen, weil sonst die Reihenfolge, in der Aufgaben ausgeführt werden, nicht bestimmt ist (dies passiert wahrscheinlich jetzt - überprüfen Sie es lokal). Was ich meine ist, wenn nur dependsOn angegeben wird build kann ausgeführt werden, dann clean und schließlich stage - und nichts wird erstellt. Ich hoffe es ist klar.

+0

hinzugefügt ok, es scheint in Ordnung, aber jetzt bekomme ich diese Ausgabe: [http://pastebin.com/ndKciqye] – Forin

+0

Diese Paste Bin wurde entfernt. – Opal

+0

http://pastebin.com/3iX9NsEr jetzt ist es in Ordnung – Forin

4

Ich habe ein Beispiel gemacht, damit Noobies wirklich jede Zeile Code herausfinden und verstehen können. Weil ich wirklich weiß, wie frustrierend das sein kann, um herauszufinden.

Dies ist, was Ihr procfile wie

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

wie

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

die gradlew und gradlew.bat sind nicht in der Hauptprojektverzeichnis oder aussehen sollte Dies ist, was Ihre Gradle Datei Wenn aussehen sollte nicht aktuell, dann in cmd den Befehl gradle wrapper ausführen.

Wenn Gradle nicht auf Ihrem Computer installiert ist, installieren Sie es von der Hauptwebsite.

Mein Beispiel auf Github ist unten.

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – ChipsLetten

+1

Kk danke bro Ich werde das jetzt tun – SARose

+1

Dies sollte das offizielle Großhirn Springboot heroku Beispiel sein, nicht einige vage Tutorial auf ihrer offiziellen Website: https://devcenter.heroku.com/articles/deploying-gradle-apps-on-on- heroku +1 – Simon

Verwandte Themen