2012-08-28 1 views
0

Je suis très nouveau pour les scripts Apple donc s'il vous plaît ours avec moi. Je dois exécuter un fichier .jar en utilisant applescript, le jar n'est pas exécutable, donc j'appelle le class comme com.path.to.myClass. Mon Apple script ressemble dessous-Java en cours d'exécution à partir de Apple Script

display alert "You are about to start the image rename process." buttons {"OK", "Cancel"} 
set theAnswer to button returned of the result 
if theAnswer is "OK" then 
    do shell script "java -classpath ./ImageRename_JAVA-1.0.0.jar:. com.mff.image.rename.Main" 
else 
    say "Exit" 
end if 

Les deux AppleScript et ImageRename_JAVA-1.0.0.jar sont dans le même répertoire, mais quand je lance le script, il me donne un ERROR-

error "Exception in thread \"main\" java.lang.NoClassDefFoundError: com/mff/image/rename/Main 
Caused by: java.lang.ClassNotFoundException: com.mff.image.rename.Main 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)" number 1 

Suis-je régler la classpath faux? Si oui, quelle est la bonne façon? Aussi, comment puis-je ajouter plus de jar au classpath? Lorsque j'exécute la commande ci-dessous à partir de Terminal, cela fonctionne très bien.

$ java -classpath ./ImageRename_JAVA-1.0.0.jar:. com.mff.image.rename.Main 

Je sais que cela peut être fait d'une meilleure façon en utilisant JAR Bundler mais je n'ai aucun contrôle sur le JAR et son développé par quelqu'un d'autre. Est-il possible que je puisse inclure tous les JAR dans l'application sous le répertoire YourApplicationName.app/Contents/MacOS/Resources/Java/ et les utiliser dans le chemin de la classe.

+0

Jetez un oeil à cette réponse [SO] (http://stackoverflow.com/questions/12101240/java-lang-noclassdeffounderror-org-w3c-tidy-tidy-maven-project/12106292#12106292). Vous devez également utiliser ";" sur win ou ":" sur linux/apple si vous voulez ajouter plus de jars au classpath – Sal

+0

@Sal .. c'est essentiellement la même chose que je fais. La commande fonctionne dans 'terminal' (invite de commande) mais échoue lorsqu'elle est exécutée à partir de' applescript'. – Annjawn

Répondre

2

Je ne pense pas que vous pouvez garantir ce que le répertoire de travail est dans un do shell script, mais vous pouvez le travailler avec quelque chose comme ceci:

set scriptPath to the POSIX path of (path to me) 
do shell script "SCRIPTDIR=`dirname " & scriptPath & "` ; " ¬ 
    & "java -classpath $SCRIPTDIR/ImageRename_JAVA-1.0.0.jar:$SCRIPTDIR com.mff.image.rename.Main" 

Pour ajouter JARs supplémentaires au classpath, vous pouvez profiter d'un raccourci fourni par la commande java, une entrée de chemin de classe se terminant par * incluant tous les fichiers .jar dans le répertoire donné.

do shell script "java -classpath " ¬ 
    & "/Applications/Something.app/Contents/Resources/Java/\\* com.example.MyClass" 

Les * a besoin d'être backslash pour le protéger de l'expansion par le shell et la barre oblique inverse doit être antislash échappé quand il est dans une chaîne AppleScript littérale, d'où le \\*.

+0

Salut Merci, j'ai été capable de le faire fonctionner en utilisant le caractère joker '*' pour plusieurs bocaux. Cependant, j'ai un nouveau problème - certains de mes pots sont sur un lecteur réseau Windows. Donc quand j'utilise quelque chose comme ça - 'smb: // utilisateur: passe @ serveur/shared/jars/*' dans le chemin de la classe, cela ne semble pas fonctionner. Est-il possible d'inclure des chemins réseau dans le fichier JAR? (Remarque: cela fonctionne sous Windows) – Annjawn

+0

Pas que je sache. Vous pouvez utiliser 'mount volume" smb: // utilisateur: pass @ server/shared "' pour attacher au partage, puis faire référence à ses fichiers comme '/ Volumes/shared/jars/*' mais cela peut être un peu fragile . –

+0

@IanRoberts ... Merci, oui j'ai dû monter le lecteur réseau. En outre, à votre point précédent l'utilisation générique dans 'classpath' ne fonctionnait que sur java 1.6, les utilisateurs ont java 1.5 et cela ne fonctionne pas dans leur système, donc j'ai dû inclure tous mes jars dans l'application' resource' et utiliser 'set thePath to (chemin vers la ressource "jarname.jar") 'pour trouver le chemin. J'ai aussi dû changer le répertoire (à ce chemin) dans le 'do shell script' comme' "JARDIR = $ (dirname" & thePath &"); cd $ JARDIR "' et ensuite utiliser 'java -cp $ JARDIR/...: $ JARDIR/... 'et le changement de répertoire a fonctionné. – Annjawn

Questions connexes