Плющ, муравей и стартовые скрипты - PullRequest
3 голосов
/ 09 ноября 2009

У меня есть проект, который использует ant для сборки и ivy для зависимостей. Я хотел бы сгенерировать стартовые сценарии для моего проекта с использованием classpath на основе зависимостей, настроенных в Ivy, тем более что порядок зависимостей может быть важным и должен быть сохранен из порядка в конфигурации ivy.

Кто-нибудь делал это раньше? Мне также нужно сгенерировать относительные пути в classpath, чтобы я не мог использовать абсолютные пути, так как это будет работать только для машины, на которой выполняется сборка.

РЕДАКТИРОВАТЬ: Основываясь на обратной связи, если мы вырежем Айви из уравнения (сделайте решение в каталог по своему выбору), я, возможно, тогда смогу решить список библиотек в порядке. Но как мне сгенерировать classpath, подходящий для стартового скрипта, особенно с относительными путями (относительно моего каталога bin)?

, например

install
    /bin <-- scripts here
    /lib <-- jars here

Так что в моем bin/start.sh мне нужно иметь ../lib/ перед каждым указанием фляги, а не полным абсолютным путем.

Спасибо.

Ответы [ 4 ]

1 голос
/ 12 ноября 2009

Так как много лет (2000?) У нас был этот маленький скрипт в пути ("make_cp")

#!/usr/bin/perl

my $CLASSPATH="";
my $DIR=shift;
$DIR||="lib";

opendir(LIBDIR, $DIR);
while ($file = readdir(LIBDIR)) {
    $CLASSPATH.=":$DIR/$file" if ($file =~ /\.jar$|\.zip$/);
}
closedir(LIBDIR);
$CLASSPATH=~ s/^://g;
print "$CLASSPATH";

Используется так:

export CLASSPATH=`make_cp lib`:`make_cp external-lib`
0 голосов
/ 10 ноября 2009

Как сказал Esko, вы должны создать JAR, включая все необходимые JAR-архивы:

<zip destfile="abc.jar">
    <zipgroupfileset dir="lib/distributed" includes="*.jar"/>
    <manifest>
        <attribute name="Main-Class" value="com.acme.MyClass"/>
    </manifest>
</zip>

После этого ваш стартовый скрипт просто:

java -jar abc.jar
0 голосов
/ 12 ноября 2009

Если вы используете Java 1.6, вы можете использовать файловые глобусы (т.е. java -cp "../lib/*"). Если вы используете более раннюю версию Java и не хотите использовать решение Владимира, вам нужно написать скрипт, который выяснит, каким должен быть путь к классу.

Итак, файл launch.sh выглядит примерно так:

cd dirname %0 # change to the bin directory, use %0/.. instead and you can replace ../lib with just /lib
sh set_classpath.sh  # set the classpath
java -cp $CLASSPATH some.package.Main 

и set_classpath.sh будут иметь некоторую магию linux, которая устанавливает CLASSPATH равным чему-то вроде

export CLASSPATH=`ls *.jar | sed 's/[^.jar].jar/..\/lib\/\0:/'`
0 голосов
/ 09 ноября 2009

Поскольку Айви высвобождает перекрывающиеся зависимости и пытается найти наилучшую общую зависимость для всех проектов, я не совсем понимаю, как будет иметь значение порядок зависимостей.

Однако вы должны создать стандартный JAR / WAR / other с Ant для вашего проекта и включить зависимости Ivy в этот JAR. По сути, все, что вам нужно сделать, это сделать задачу Ivy Ant для разрешения зависимостей в папке, затем создать классы с использованием этих зависимостей и затем создать JAR, чтобы включить библиотеку JAR: s во вновь созданную папку JAR / lib / .

...