2015-05-27 31 views
8

Ho configurato con successo il mio script gradle build per creare una distribuzione zip della mia applicazione con una cartella "config" aggiuntiva nella root. Questa cartella contiene (almeno al momento) solo un file di proprietà in uso dall'applicazione e si trova sul classpath per l'applicazione.Come specificare una cartella aggiuntiva sul percorso di classe per l'attività "esegui" del plugin dell'applicazione gradle?

Quello che sto cercando ora, tuttavia, è un modo per fare lo stesso con l'attività "Esegui" nel plugin dell'applicazione. Quando provo a eseguire la mia applicazione in questo modo, (per il test), il mio programma non riesce a funzionare a causa di una classe che tenta di accedere a questo file delle proprietà nella root del classpath.

Un bonus sarebbe se potessi ottenere IntelliJ o Eclipse per aggiungere anche questa cartella al suo classpath proprio come le altre cartelle (src/main/java, src/main/resources, ...) in modo da poter eseguire e eseguire il debug del mio codice dall'interno dell'IDE senza richiamare un'attività gradle. Voglio cercare di evitare il più possibile legando questo codice a qualsiasi IDE, in modo che quando qualcuno debba lavorare al progetto, abbia solo bisogno di importare il file build.gradle e fare in modo che l'IDE faccia i file di configurazione appropriati di cui ha bisogno .

Ecco il mio file build.gradle:

apply plugin: 'application' 

mainClassName = "MainClass" 

startScripts { 
    // Add config folder to classpath. Using workaround at 
    // https://discuss.gradle.org/t/classpath-in-application-plugin-is-building-always-relative-to-app-home-lib-directory/2012 
    classpath += files('src/dist/config') 
    doLast { 
     def windowsScriptFile = file getWindowsScript() 
     def unixScriptFile = file getUnixScript() 
     windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\config', '%APP_HOME%\\config') 
     unixScriptFile.text = unixScriptFile.text.replace('$APP_HOME/lib/config', '$APP_HOME/config') 
    } 
} 

repositories { 
    ... 
} 

dependencies { 
    ... 
} 

Probabilmente ciò che deve accadere è che ho bisogno di avere la dist cartella config/src// da copiare nella directory di compilazione e ha aggiunto al classpath , o avere il suo contenuto essere copiato in una cartella che è già sul classpath.

risposta

2

Come si può vedere nel docsrun è un'attività di tipo JavaExec. Quindi classpath per poter essere modificato. Prova ad aggiungere la cartella config al classpath. Vedi here.

+1

Suppongo che se aggiungiamo qualche cartella al set di fonti, sarà messo in un file jar (questo è solo il mio suggerimento, non l'ho controllato e vale la pena controllare). Abbiamo bisogno di avere una cartella separata, cioè su classpath, ma non all'interno di un jar. – lospejos

15

Ho finito per accettare il suggerimento di Opal come suggerimento e ho trovato la seguente soluzione. Ho aggiunto il seguente al mio file build.gradle:

task processConfig(type: Copy) { 
    from('src/main/config') { 
     include '**/*' 
    } 

    into 'build/config/main' 
} 

classes { 
    classes.dependsOn processConfig 
} 

run { 
    classpath += files('build/config/main') 
} 

In alternativa, un approccio più semplice sarebbe quella di aggiungere una dipendenza runtime per il mio progetto in quanto tale:

dependencies { 
    ... 
    runtime files('src/main/config') 
} 

non ho finire per fare in questo modo, comunque, perché il mio pacchetto di distribuzione ha finito con i file .properties nella cartella lib ... e sono solo pignolo in questo modo.

+1

Ottengo 'Impossibile trovare il metodo run() per gli argomenti [build_1b0x3fpm5pz4yarfze7sl1nxw $ _run_closure2 @ 1d610f27] sul progetto root' – Gus