2014-10-15 18 views
12

Ho un problema con la mia applicazione Spring costruita con Gradle. L'app include MongoDB (MongoHQ di Heroku).Applicazione Spring Running costruita con gradle su Heroku

sono riuscito come spingere tutto su Heroku, ho aggiunto questo codice al mio progetto:

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

Dopo aver cambiato buildpacks ad uno con Gradle, ho spinto tutto su Heroku account gratuito con MongoHQ Sandbox.

Ma dopo aver cercato di correre la mia app attraverso il browser web, sto ottenendo questo errore:

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 mi dà questo output:

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=

Credo che il problema è nella Procfile, ma non ho idea di cosa dovrei aggiungere, ecco il mio codice attuale:

default_process_types:

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

a cura

Ecco la mia 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']) 

Grazie in anticipo per il vostro aiuto.

+0

Perché non aggiungere un'attività che copia l'artefatto generato da 'build/lib' a' project.rootDir' (rinominandolo in modo appropriato) e avvia l'applicazione dalla directory principale? Sembra che non ci sia un vaso costruito. – Opal

+0

Puoi spiegare come posso farlo? – Forin

+0

Aggiungerò una risposta tra un minuto. – Opal

risposta

18

Dopo una breve discussione nei commenti sembra (secondo this istruzioni) che è necessario aggiungere il seguente compito di build.gradle di 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() 
} 

E il contenuto di Procfile sarà:

web: java $JAVA_OPTS -jar app.jar 

Ora dovrebbe funzionare bene.

Spiegazione:

Task stage prepara file jar da eseguire. Al termine, il vaso di output viene copiato in project.rootDir e rinominato in app.jar. Garantisce che avrà sempre lo stesso nome e può essere facilmente eseguito con il comando da Procfile. L'attività stage dipende anche da clean (che ha un'azione aggiuntiva per rimuovere app.jar) e build (che crea l'app). È importante impostare stage.mustRunAfter(clean) perché altrimenti l'ordine in cui vengono eseguite le attività non è determinato (ciò probabilmente accade ora - verificarlo localmente). Quello che voglio dire è che se è specificato dependsOn è possibile eseguire build, quindi clean e infine stage - e non viene creato nulla. Spero sia chiaro.

+0

ok, sembra ok, ma ora sto ricevendo questo output: [http://pastebin.com/ndKciqye] – Forin

+0

Questo cestino è stato rimosso. – Opal

+0

http://pastebin.com/3iX9NsEr ora è ok – Forin

4

Ho fatto un esempio in modo che i noobies possano veramente controllare e comprendere ogni riga di codice. Perché so davvero quanto possa essere frustrante immaginare.

Questo è ciò che il vostro Procfile dovrebbe essere simile

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

Questo è ciò che il file Gradle dovrebbe assomigliare

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

Se la gradlew e gradlew.bat non sono nella directory principale del progetto o è non aggiornato quindi in cmd eseguire il comando gradle wrapper.

Se non si dispone di Gradle effettivamente installato sul computer, installarlo dal sito Web gradle principale.

Il mio esempio su github è sotto. https://github.com/arose13/Heroku-Spring-Gradle_Example

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – ChipsLetten

+1

Kk grazie fratello Lo farò ora – SARose

+1

Questo dovrebbe essere l'esempio ufficiale di springleot heroku gradle, non un vago tutorial sul loro sito ufficiale: https://devcenter.heroku.com/articles/deploying-gradle-apps-on- heroku +1 – Simon