【问题标题】:Ivy, ant and start scriptsIvy、ant 和启动脚本
【发布时间】:2010-12-14 16:32:43
【问题描述】:

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

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

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

例如

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

所以在我的bin/start.sh 中,我需要在每个 jar 引用前加上 ../lib/,而不是完整的绝对路径。

谢谢。

【问题讨论】:

    标签: java ant scripting classpath ivy


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。都是真的,但这主要是我目前坚持的开始脚本生成。
    【解决方案2】:

    就像 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】:

      如果您使用的是 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:/'`
      

      【讨论】:

        【解决方案4】:

        多年来(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`
        

        【讨论】:

          猜你喜欢
          • 2011-12-03
          • 2014-03-12
          • 2012-06-10
          • 2018-02-24
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 2011-01-27
          相关资源
          最近更新 更多