JDBC Не удается найти класс даже после установки classpath [duplicate]

Сделайте .* неживым, добавив «?» после него:

Project name:\s+(.*?)\s+J[0-9]{7}:
60
задан toom 10 April 2013 в 16:58
поделиться

4 ответа

Вы используете либо -jar , либо -cp, вы не можете комбинировать их. Если вы хотите поместить дополнительные JAR в classpath, тогда вы должны либо поместить их в основной манифест JAR, а затем использовать java -jar, или вы поместите полный путь к классам (включая основной JAR и его зависимости) в -cp и назовите основной класс явно в командной строке

java -cp 'MyProgram.jar:libs/*' main.Main

(Я использую синтаксис dir/*, который сообщает команде java добавлять все .jar файлы из определенного каталога в путь к классам. * должен быть защищен от расширения оболочкой, поэтому я использовал одинарные кавычки.)

Вы упомянули, что используете Ant, для альтернативного манифеста, вы можете использовать ant <manifestclasspath> после после копирования зависимостей, но до построения JAR.

<manifestclasspath property="myprogram.manifest.classpath" jarfile="MyProgram.jar">
  <classpath>
    <fileset dir="libs" includes="*.jar" />
  </classpath>
</manifestclasspath>

<jar destfile="MyProgram.jar" basedir="classes">
  <manifest>
    <attribute name="Main-Class" value="main.Main" />
    <attribute name="Class-Path" value="${myprogram.manifest.classpath}" />
  </manifest>
</jar>

При этом java -jar MyProgram.jar будет работать правильно, и будет включать все файлы [J13] JAR в пути к классам.

108
ответ дан Ian Roberts 23 August 2018 в 23:50
поделиться

Для быстрых одноразовых тестов приложения вы можете просто соединить необходимые файлы JAR зависимости JAR в каталог, содержащий файл JAR основного приложения.

Пример (для приложения app.jar, которое использует библиотека SWL Eclipse, которая в моем случае была установлена ​​в /usr/share/java):

$ ln -s /usr/share/java/swt.jar .
$ java -jar app.jar
0
ответ дан ack 23 August 2018 в 23:50
поделиться

Если используется опция -jar, опция -cp игнорируется. Единственный способ установить путь к классу - использовать файл манифеста в банке.

Легче просто использовать параметр -cp, добавить к нему свой файл jar, а затем явно вызвать основной класс.

Кроме того, если папка / home / user / java / MyProgram / jar / libs содержит файлы jar (в отличие от файлов классов), это не сработает. Вы не можете указать папку jar-файла, но должны указывать каждый файл jar отдельно в пути к классам (стоит написать простой сценарий оболочки, чтобы сделать это для вас, если имеется значительное количество банок).

12
ответ дан Jonathan 23 August 2018 в 23:50
поделиться

Это немного сложно. Следующий сценарий - попытка получить путь к классу из манифеста jar, а затем разрешить добавлять дополнительные записи в classpath. Я имел смешанные результаты с этим, но хочу поделиться сценарием тем не менее, чтобы он мог быть полностью функциональным здесь.

Сценарий имеет два имени

  • showmanifest
  • calljar

путем привязки двух файлов вместе с

ln calljar showmanifest

с помощью 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
0
ответ дан Wolfgang Fahl 23 August 2018 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: