Как сделать исполняемый файл для Mac для запуска команды Java - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть следующая команда, которая работает в Windows:

java -classpath lib/prov-jdk14-132.jar;../EncUtility com.xxxx.projects.disc.bowl.FileChooseApp

Теперь я использую команду nano, чтобы сделать исполняемый файл следующей командой в OS X:

java -classpath ../EncUtility/lib/prov-jdk14-132.jar:../EncUtility com.xxxx.projects.disc.bowl.FileChooseApp

Эта команда отлично работает в терминале, но когда я использую команду nano для создания утилиты, она показывает следующую ошибку:

cp_mac1$ /Users/cp_mac1/Desktop/EncUtility/start ; exit;
Exception in thread "main" java.lang.NoClassDefFoundError: com/xxxx/projects/disc/bowl/FileChooseApp
Caused by: java.lang.ClassNotFoundException: com.xxxx.projects.disc.bowl.FileChooseApp
    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)
logout

[Process completed]

Я понял, что он использует дополнительные /start в пути. Но я не могу решить это даже с помощью cd ..

1 Ответ

2 голосов
/ 20 декабря 2011

Ваш скрипт запускается в другой папке, чем где он хранится ...

Текущий рабочий каталог, когда вы запускаете ваш скрипт, не является местоположением скрипта, это будет папка, в которой вы оказались при запуске.

Попробуйте использовать фрагмент из Получение исходного каталога скрипта Bash из , чтобы установить рабочий каталог, из которого ваши пути должны быть относительными: например,

  #!/bin/bash
  SOURCE="${BASH_SOURCE[0]}"
  while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

  cd $DIR/..
  exec java -classpath EncUtility/lib/prov-jdk14-132.jar:EncUtility \
            com.xxxx.projects.disc.bowl.FileChooseApp

Преамбула выполняет различную магию оболочки, чтобы определить, где на самом деле хранится скрипт. cd затем меняет рабочий каталог на папку, содержащую его, а exec просто для крошечной эффективности: он заменяет исполняемый процесс вашего скрипта на Java VM, а не запускает его как дочерний процесс. (Обратите внимание, что ничего кроме exec не будет работать в вашем скрипте.)

...