2010-09-05 9 views
0

j'ai un nouveau problème dans image magick qui a l'air étrange .. j'utilise mac osx snow léopard et j'ai installé image magick sur elle et ça fonctionne bien sur la commande .. mais quand Je l'appelle de la classe Grails comme ce qui suit snippet il me donne "Impossible de lancer le programme "convertir": error = 2, Aucun fichier ou répertoire"problème dans imagemagick et grails

le code est: -

public static boolean resizeImage(String srcPath, String destPath,String size) { 

    ArrayList<String> command = new ArrayList<String>(10); 


    command.add("convert"); 
    command.add("-geometry"); 
    command.add(size); 
    command.add("-quality"); 
    command.add("100"); 
    command.add(srcPath); 
    command.add(destPath); 

    System.out.println(command); 

    return exec((String[])command.toArray(new String[1])); 
} 

private static boolean exec(String[] command) { 
    Process proc; 

    try { 
     //System.out.println("Trying to execute command " + Arrays.asList(command)); 
     proc = Runtime.getRuntime().exec(command); 
    } catch (IOException e) { 
     System.out.println("IOException while trying to execute "); 
     for(int i =0 ; i<command.length; i++) { 
     System.out.println(command[i]); 
     } 
     return false; 
    } 

    //System.out.println("Got process object, waiting to return."); 

    int exitStatus; 

    while (true) { 
     try { 
      exitStatus = proc.waitFor(); 
      break; 
     } catch (java.lang.InterruptedException e) { 
      System.out.println("Interrupted: Ignoring and waiting"); 
     } 
    } 
    if (exitStatus != 0) { 
     System.out.println("Error executing command: " + exitStatus); 
    } 
    return (exitStatus == 0); 
} 

i 'ai essayé la commande normale comme ls et c'est ok donc le problème est que les grails ne peuvent pas trouver la commande de conversion elle-même .. est-ce un os p roblem ou quelque chose?

Répondre

0

Vous devez déterminer la valeur de PATH lorsque vous exécutez une commande à partir de Java. Il doit être différent de celui que vous avez en cours d'exécution du terminal.

Exécutez-vous Grails (via Tomcat?) En tant qu'utilisateur différent? Il pourrait avoir un chemin différent à votre utilisateur normal.

+0

J'utilise NetBeans il est donc en utilisant la jetée je suppose .. alors que puis-je faire –

0

vous pouvez essayer un des plug-ins d'image qui font partie de l'écosystème Grails

http://www.grails.org/ImageTools+plugin

le chemin de Grails lorsque l'application est en cours d'exécution dans le serveur est probablement différent de l'exécution Java à partir de la commande ligne

+0

je l'ai essayé et c'est pourquoi j'ai besoin d'images magick .. la qualité n'est pas si bonne et les options ne sont pas comme image magick –

+0

j'ai trouvé le même problème, donc je juste utiliser les bibliothèques jai sous-jacentes et créé mon propre service –

+0

cela pourrait résoudre certains de vos problèmes http://sourceforge.net/projects/jmagick/ –

0

je fais:

placer le fichier "convertir"/usr/bin

Ensuite, ajoutez t o Config.groovy:

gk { 
    imageMagickPath = "/usr/bin/convert" 
} 

Puis dans mon ImageService.groovy:

import org.springframework.web.context.request.RequestContextHolder as RCH 

[..]

def grailsApplication = RCH.requestAttributes.servletContext.grailsApplication 
def imPath = grailsApplication.config.gk.imageMagickPath 
def command = imPath + " some_properties" 
def proc = Runtime.getRuntime().exec(command) 

donc cette façon, vous obtenez comme commande:/usr/bin/convertir some_properties

Et cela fonctionne, mais n'oubliez pas de mettre le fichier "convert" à votre emplacement et l'utiliser avec cet emplacement.

1

(voir plus bas pour la réponse)

J'ai couru dans le même problème. Le problème semble être spécifique à Mac OS X, car plusieurs instances Linux s'exécutent sans erreur. L'erreur ressemble à ce qui suit:

java.io.IOException: Impossible d'exécuter le programme "/usr/bin/ImageMagick-6.7.3/bin/convert/a/temp/in/tmpPic3143119797006817740.png/a/temp /out/100000726.png ": error = 2, Aucun fichier ou répertoire de ce type

Tous les fichiers sont là, et dans les répertoires chmod 777 - et comme vous l'avez souligné, l'exécution de la commande exacte depuis le shell fonctionne correctement. Ma théorie à ce stade est que imagemgick ne peut pas charger une sorte de bibliothèque elle-même, et le "aucun tel fichier" est en référence à un dylib ou quelque chose le long de ces lignes.

J'ai essayé de définir LD_LIBRARY_PATH et quelques autres en vain.


J'ai finalement obtenu ce travail. Voici comment je l'ai configuré. J'espère que ça aide.

Le point crucial du correctif, pour moi, étais-je Enveloppez la « convertir » dans un script shell, définissez un tas de variables d'environnement, puis appelle le script shell au lieu de convertir directement:

(convertWrapper. sh)

export MAGICK_HOME=/usr/local/ImageMagick-6.7.5 
export MAGICK_CONFIGURE_PATH=${MAGICK_HOME}/etc/ImageMagick:${MAGICK_HOME}/share/doc/ImageMagick/www/source 

export PATH=${PATH}:${MAGICK_HOME}/bin 
export LD_LIBRARY_PATH=${MAGICK_HOME}/lib:${LD_LIBRARY_PATH} 
export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${MAGICK_HOME}/lib 
export MAGICK_TMPDIR=/private/tmp 

echo "[email protected]" >> /private/tmp/m.log 2>&1 
/usr/local/ImageMagick-6.7.5/bin/convert -verbose "[email protected]" >> /private/tmp/m.log 2>&1 

(convertWrapper.sh)

en outre, l'appel a été converti en train de faire des choses assez compliquées, donc j'ajouté le paramètre « -respect parenthèse » (qui peut ou non avoir eu un effet).

Je ne sais pas à quel point l'environnement définition de variables est nécessaire que je poignarder dans le noir pendant un certain temps, mais comme cela est seulement pour ma boîte de développement ...