2013-12-16 8 views
5

ho il compito Gradle che dovrebbe creare il profilo WebSphere su sistema operativo WindowsGradle: Esegui "Tipo: Exec" con molti argomenti con gli spazi

task createProfile(type:Exec) { 

    def commandToExecute = new StringBuffer() 
    def profile = 'AppSrv02' 
    def wasHome = 'C:/IBM new/WebSphere/AppServer' 

    def str = new LinkedList <String>(); 
    str.add('cmd') 
    str.add('/c') 
    str.add(wasHome + '/bin/manageprofiles.bat') 
    str.add('-create') 
    str.add('-profileName') 
    str.add(profile) 
    //str.add('-templatePath') 
    //str.add(wasHome + '/profileTemplates/default') 

    println (str) 
    commandLine str.toArray() 

} 

E il problema appare se rimuovere il commento righe di commento, dopo che è compito fallisce e mi dice che: "C:/IBM" non è un file batch valido. Se metto profileTemplates non nella cartella che contiene spazi, tutto funziona di nuovo bene. Ma i template dovrebbero essere int wasHome (E a ​​volte wasHome ha spazi (

Ho, ora idee per cui l'aggiunta di template chiave con valore con spazi influenza in modo tale che Gradle prova ad avviare "C:/IBM" invece specificato "C:/IBM nuovo/WebSphere/AppServer/bin/manageprofiles.bat '. Sembra che, possibilmente, problema all'interno di java.lang.ProcessBuilder.

Provo a citare percorsi, aggiungendo "/"" ma non funziona nulla (((cosa non è una sorpresa, perché ProcessBuilder implica quotarsi da solo se è necessario

Quindi, sto chiedendo se qualcuno ha avuto il problema simile e potrebbe consigliare come aggirare questo problema? Grazie in anticipo.

risposta

7

Se qualcuno ne avesse avuto bisogno, abbiamo trovato una soluzione per questo problema. Il compito, infine, si presenta come:

task createProfile(type: Exec) { 
    executable = new File(wsadminLocation, manageProfilesFileName) 
    def templatePath = wasHome + File.separator + "profileTemplates" + File.separator + "default" 
    def argsList = ["-create", "-profileName", profile, "-templatePath", templatePath, "-nodeName", nodeName, "-cellName", wasCellName, "-enableAdminSecurity", isProfileSecured, "-adminUserName", rootProject.wasLogin, "-adminPassword", rootProject.wasPassword] 
    args = argsList 
} 

L'idea di base è quella di passare gli argomenti al Gradle non come serie lunga, ma come una lista. Quindi in questo modo non ci sono problemi se un argomento contiene uno spazio.

+0

Questa soluzione non ha funzionato per me. Avevo un argomento come' --autoprefix = " ultime 2 versioni "', e gli spazi tra le doppie virgole gettavano sempre via le cose. –

2

Modificare le seguenti linee

def wasHome = '"C:/IBM new/WebSphere/AppServer' 
... 
str.add(wasHome + '/bin/manageprofiles.bat"') 

In questo modo, il percorso completo del file batch è citato.

MODIFICATO - Come affermato da dbenhan, un po 'offuscato. Questo qualcosa "dovrebbe" essere come

task createProfile(type:Exec) { 

    def commandToExecute = new StringBuffer() 
    def profile = 'AppSrv02' 
    def wasHome = 'C:/IBM new/WebSphere/AppServer' 

    def str = new LinkedList <String>(); 
    str.add('cmd') 
    str.add('/c') 
    str.add('"' + wasHome + '/bin/manageprofiles.bat"') 
    str.add('-create') 
    str.add('-profileName') 
    str.add(profile) 
    str.add('-templatePath') 
    str.add('"' + wasHome + '/profileTemplates/default"') 

    println (str) 
    commandLine str.toArray() 

} 

MA, mentre Gradle in particolare e finestre, in generale, in grado di gestire i percorsi con separatori oblique, non ho idea se manageprofiles.bat può, e si passa un parametro con un percorso in esso . Forse, dovrai modificare i percorsi per 'c:\\IBM new\\....'

+0

+1, o forse un po 'meno offuscato: 'str.add (' " '+ washome +'/bin/manageprofiles.bat"')' – dbenham

+0

@dbenham: Lo so. Ma questo permette di decommentare le seguenti due righe e usare 'str.add (wasHome + '/ profileTemplates/default"') riutilizzando la citazione iniziale (scherzando, hai ragione ;-)) –

+0

provato entrambi, sempre lo stesso risultato ((((ancora non funziona, in qualche modo si fa perfettamente, con gradle non riesco a riuscirci. – serg

0

Try This

task xyz { 
def result1 = exec { 
      workingDir "D:/abc/efg" 
      commandLine 'cmd', '/c', 'CDUTIL.bat', "qwe", "rty" 
     } 

     println result1.toString() 
}