Я создал jar-файл, содержащий все мои скомпилированные файлы. Кроме того, мой скрипт сборки ant копирует необходимые библиотеки в подпапку «libs». Структура выглядит так:
MyProgram.jar
libs/
Поэтому, когда я пытаюсь запустить свою программу сейчас, я получаю следующую ошибку:
java -cp ".:/home/user/java/MyProgram/jar/libs" -jar MyProgram.jar
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at database.PostgresQL.getConnection(PostgresQL.java:38)
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:19)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
java.lang.NullPointerException
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:25)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
Почему так происходит?
<manifestclasspath>
;
), поскольку двоеточие в Windows используется для букв дисков. OP использовал двоеточия и косую черту в своем вопросе, предполагая, что они работают на Linux или Mac.Когда
-jar
опция используется,-cp
она игнорируется. Единственный способ установить путь к классам - использовать файл манифеста в банке.Проще просто использовать эту
-cp
опцию, добавить к ней свой jar-файл, а затем явно вызвать основной класс.Кроме того, если
/home/user/java/MyProgram/jar/libs
папка содержит файлы jar (в отличие от файлов классов), это не сработает. Вы не можете указать папку с файлом jar, но должны указать каждый файл jar индивидуально в пути к классам (стоит написать простой сценарий оболочки, чтобы сделать это за вас, если существует значительное количество jar).источник
Это немного сложно. Следующий скрипт представляет собой попытку получить путь к классам из манифеста jar-файла и затем разрешить добавление дополнительных записей пути к классам. У меня были смешанные результаты, но я все же хочу поделиться сценарием, чтобы здесь можно было сделать его полностью функциональным.
У скрипта два названия
жестко связав два файла вместе с
с calljar -h вы можете увидеть использование.
#!/bin/bash #set -x # show the manifest of a jar file # 2012-07-18 # author WF # # show usage # usage() { echo "usage: showmanifest (jarfile | directory jarfile) " 1>&2 echo "usage: calljar directory jarfile classpath pattern arguments" 1>&2 echo " -h|--help " 1>&2 echo " show this help and exit" 1>&2 echo " -m|--mainclass javaclass" 1>&2 echo " mainclass to use (otherwise manifest is inspected)" 1>&2 exit 1 } # # show the manifest of the given jar file # show() { dir="$1" jar="$2" fulljar=`find "$dir" -name "$jar"` cd /tmp mkdir show$$ cd show$$ jar xvf $fulljar META-INF/MANIFEST.MF cat META-INF/MANIFEST.MF cd /tmp rm -rf show$$ } # # show the classpath of the manifest # calljar() { dir="$1" jar="$2" classpath="$3" pattern="$4" arguments="$5" cmd=`show "$dir" "$jar" | awk -v extracp="$classpath" -v dir="$dir" -v pattern="$pattern" -v jar="$jar" -v mainclass="$mainclass" -v args="$arguments" ' /Main-Class: / { if (mainclass=="") mainclass=$2 } /^Class-Path:/ { incp=1; cp=$0; gsub("Class-Path: ","",cp) next } /^ .*$/ && incp { line=substr($0,2) # remove carriage return (if any) cp=cp line } END { # we do not like carriage returns gsub("\\r","",cp) gsub("\\r","",mainclass) # we do not like blanks ... gsub(" ","",cp) gsub(pattern,":"dir"/"pattern,cp) print "java -cp " extracp cp ":"dir"/"jar " " mainclass " " args } '` #echo $cmd $cmd } # echo $# arguments found: $* # parse command line options while true; do # echo "option $1" case "$1" in # options without arguments -h|--help) usage;; # for options with required arguments, an additional shift is required -m|--mainclass) mainclass=$2; shift;; (--) shift; break;; (-*) echo "$0: error - unrecognized option $1" 1>&2; usage;; (*) dir=$1;shift;break;; esac shift done #echo "argcount=$#" case $# in 0) dir=`dirname "$dir"` jar=`basename "$dir"` show "$dir" "$jar";; 1) jar="$1" show "$dir" "$jar";; 2) usage;; 3) usage;; *) jar="$1"; shift; classpath="$1"; shift; pattern="$1"; shift; arguments="$@"; #echo "mainclass=${mainclass}" #echo "classpath=${classpath}" #echo calljar "${dir}" "${jar}" "${classpath}" "$pattern" "$arguments" calljar "$dir" "$jar" "$classpath" "$pattern" "$arguments" ;; esac
источник
Для быстрых одноразовых тестов приложения вы можете просто создать символическую ссылку на необходимые файлы JAR зависимостей в каталог, содержащий основной файл JAR приложения.
Пример (для приложения,
app.jar
использующего библиотеку Eclipse SWT, которая в моем случае была установлена в/usr/share/java
):источник