3

我有一个使用 ant 构建和 ivy 依赖项的项目。我想为我的项目生成启动脚本,使用类路径,基于在 Ivy 中配置的依赖项,特别是因为依赖项的顺序可能很重要,需要从 ivy 配置中的顺序中保留。

有没有人这样做过?我还需要在类路径中生成相对路径,因此我不能使用绝对路径,因为这仅适用于完成构建的机器。

编辑:根据反馈,如果我们将 Ivy 去掉等式(对我选择的目录进行解析),那么我可能可以解析 libs 列表。但是我将如何生成适合启动脚本的类路径,尤其是相对路径(相对于我的 bin 目录)?

例如

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

因此,在我的每个 jar 引用之前,bin/start.sh我需要有一个完整的绝对路径。../lib/

谢谢。

4

4 回答 4

1

多年来(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`
于 2009-11-12T14:04:25.483 回答
0

就像 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
于 2009-11-10T20:16:41.700 回答
0

如果您使用的是 java 1.6,则可以使用文件 glob(即 java -cp "../lib/*")。如果您使用的是早期版本的 java 并且不想使用 Vladimir 的解决方案,则需要编写一个脚本来确定类路径应该是什么。

所以 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 设置为等于“../lib/abc.jar:../lib/def.jar”之类的东西

export CLASSPATH=`ls *.jar | sed 's/[^.jar].jar/..\/lib\/\0:/'`
于 2009-11-12T02:26:28.800 回答
0

由于 Ivy 驱逐了重叠的依赖关系并试图为所有项目找到最佳的公共依赖关系,我真的不明白依赖关系的顺序有什么关系。

但是,您应该为您的项目使用 Ant 制作一个标准的 JAR/WAR/other,并在该 JAR 中包含 Ivy 依赖项。基本上,您需要做的就是让 Ivy 的 Ant 任务将依赖项解析到一个文件夹,然后使用这些依赖项构建 tha 类,然后构建 JAR,以便将库 JAR:s 包含到新创建的 JAR 的 /lib/ 文件夹中.

于 2009-11-09T16:07:19.783 回答