我有一个项目使用ant构建和依赖的ivy。我想基于Ivy中配置的依赖项,使用类路径为我的项目生成启动脚本,特别是因为依赖项的顺序可能很重要,需要从常春藤配置中的顺序中保留。
以前有人这样做过吗?我还需要在类路径中生成相对路径,因此我不能使用绝对路径,因为这只适用于构建完成的机器。
编辑:根据反馈,如果我们将Ivy排除在等式之外(解析到我选择的目录),那么我可以解析libs列表。但是,如何生成适合启动脚本的类路径,尤其是相对路径(相对于我的bin目录)?
e.g。
install
/bin <-- scripts here
/lib <-- jars here
所以在我的bin/start.sh
中,我需要在每个jar参考前面有../lib/
而不是完整的绝对路径。
感谢。
答案 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:/'`