如何在JAR清单文件中指定类路径加载顺序

时间:2015-01-08 13:53:44

标签: java ant jar

我正在使用Ant创建一个JAR文件,但是我需要为Manifiest文件中生成的JAR文件指定类路径加载顺序。

原因是因为我使用的某些依赖项使用了另一个库的不同版本,我需要确保加载了最新的版本。这很容易使用Eclipse界面,但我不知道如何使用Ant。

这就是我现在所拥有的JAR任务:

<target depends="build-project" name="jar">
            <!-- Get the timestamp -->  
            <set.timestamp/>
            <!-- Create our own manifest file for our JAR -->
            <manifest file="MANIFEST.MF">
                <attribute name="Built-By" value="${username} - ${company.name}"/>
                <attribute name="Main-Class" value="some.package.Main"/>
                <attribute name="Class-path" value=". ${lib.list}"/> 
                <attribute name="Implementation-Version" 
                    value="${major.version.number}.${minor.version.number}.${revision.number}"/>   
                <attribute name="Built-Date" value="${current.time}"/>                 
            </manifest>

            <jar whenmanifestonly="fail" destfile="${dist.dir}/${jar.name}_${major.version.number}.${minor.version.number}.${revision.number}.jar" manifest="MANIFEST.MF">
</target>

现在这是Classpath属性:

<manifestclasspath property="lib.list" jarfile="${dist.dir}/${jar.name}_${major.version.number}.${minor.version.number}.${revision.number}.jar">
   <classpath refid="manifest.classpath" />
</manifestclasspath>

这是manifest.classpath:

<!-- Manifest classpaht -->
<path id="manifest.classpath">
    <fileset dir="${dist.dir}/lib">
          <include name="*.jar"/>
      </fileset>
</path>

对我而言,我似乎必须在上面逐个手动定义每个库,而不是使用通配符......但是之后该命令会被提供吗?

谢谢! 亚历

2 个答案:

答案 0 :(得分:2)

定义类路径时,可以复制该路径中的jar,就像在$PATH中复制目录一样。这很草率,但也不错:

PATH="/bin:/usr/bin:$HOME/bin:/usr/local/bin:/bin"

/bin目录被指定两次,但这无关紧要。如果我指定ls,我/bin中的$PATH的第一个实例会找到它。我/bin$PATH的最后一个实例没有做任何事情。复制没有造成真正的伤害。

如果您需要指定某个罐子必须是第一个的类路径,那么请先指定您需要的内容。如果$PATH再次包含该特定jar名称,则无关紧要:

 <path id="manifest.classpath">
     <pathelement location="${first.jar}"/>
     <pathelement location="${second.jar}"/>
     <fileset dir="${manifest.jars.dir}"/>
</path>

即使${first.jar}${second.jar}${manifest.jars.dir}中,也无关紧要。它们仍会在你的路径中首先被拾取,然后在你的路径中被忽略。

现在,你可以这样做:

<manifestclasspath property="manifest.path">
    <pathelement location="."/>
    <classpath refid="manifest.classpath"/>
</manifestclasspath>

最后:

<jar destdir="....">
    <manifest>
        <attribute name="Class-path" value="${manifest.path}"/>
        ...
    </manifest>
</jar>

答案 1 :(得分:0)

据我所知,清单中的类路径将按照您提供的顺序排列的条目定义。我知道它在Maven中的效果是这样的,并且非常确定在Ant中也是如此,所以你能做的就是提供&#34; critical&#34;条目首先 - 然后放入通配符,从而提供所需的订单 - 而不是手动定义所有必需的依赖项。