Сделайте .*
неживым, добавив «?
» после него:
Project name:\s+(.*?)\s+J[0-9]{7}:
Вы используете либо -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 в пути к классам.
Для быстрых одноразовых тестов приложения вы можете просто соединить необходимые файлы JAR зависимости JAR в каталог, содержащий файл JAR основного приложения.
Пример (для приложения app.jar
, которое использует библиотека SWL Eclipse, которая в моем случае была установлена в /usr/share/java
):
$ ln -s /usr/share/java/swt.jar .
$ java -jar app.jar
Если используется опция -jar, опция -cp игнорируется. Единственный способ установить путь к классу - использовать файл манифеста в банке.
Легче просто использовать параметр -cp, добавить к нему свой файл jar, а затем явно вызвать основной класс.
Кроме того, если папка / home / user / java / MyProgram / jar / libs содержит файлы jar (в отличие от файлов классов), это не сработает. Вы не можете указать папку jar-файла, но должны указывать каждый файл jar отдельно в пути к классам (стоит написать простой сценарий оболочки, чтобы сделать это для вас, если имеется значительное количество банок).
Это немного сложно. Следующий сценарий - попытка получить путь к классу из манифеста jar, а затем разрешить добавлять дополнительные записи в classpath. Я имел смешанные результаты с этим, но хочу поделиться сценарием тем не менее, чтобы он мог быть полностью функциональным здесь.
Сценарий имеет два имени
путем привязки двух файлов вместе с
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