常春藤,蚂蚁和启动脚本

时间:2009-11-09 15:58:10

标签: java ant scripting classpath ivy

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

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

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

e.g。

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

所以在我的bin/start.sh中,我需要在每个jar参考前面有../lib/而不是完整的绝对路径。

感谢。

4 个答案:

答案 0 :(得分: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`

答案 1 :(得分:0)

由于Ivy驱逐了重叠的依赖关系,并试图找到所有项目的最佳公共依赖关系,但我并不真正理解依赖关系的顺序如何。

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

答案 2 :(得分: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

答案 3 :(得分:0)

如果你使用的是java 1.6,你可以使用文件globs(即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:/'`