[英]Ivy, ant and start scripts
我有一个项目使用ant构建和依赖的常春藤。 我想基于Ivy中配置的依赖项,使用类路径为我的项目生成启动脚本,特别是因为依赖项的顺序可能很重要,需要从常春藤配置中的顺序中保留。
有没有人这样做过? 我还需要在类路径中生成相对路径,因此我不能使用绝对路径,因为这只适用于构建完成的机器。
编辑:根据反馈,如果我们切断常春藤的方程式(解析到我选择的目录)我可能然后可以解析库的列表确定。 但是,如何生成适合启动脚本的类路径,尤其是相对路径(相对于我的bin目录)?
例如
install
/bin <-- scripts here
/lib <-- jars here
所以在我的bin/start.sh
我需要在每个jar引用前面都有../lib/
而不是完整的绝对路径。
谢谢。
多年(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`
由于Ivy驱逐了重叠的依赖关系,并试图找到所有项目的最佳公共依赖关系,我并不真正理解依赖关系的顺序如何重要。
但是,您应该为项目创建一个标准的JAR / WAR /其他Ant,并在该JAR中包含Ivy依赖项。 基本上你需要做的就是让Ivy的Ant任务解决文件夹的依赖关系,然后使用这些依赖关系构建类,然后构造JAR,以便将库JAR:s包含到新创建的JAR的/ lib /文件夹中。
像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
如果你使用的是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:/'`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.