没有META-INF的Ant Build Jar

时间:2011-08-21 10:54:46

标签: java ant jar meta-inf

如何使用没有META-INF文件夹的ant构建jar?我没有在:

中指定任何清单属性
<jar destfile="${build}/${jar}/${client}.jar" basedir="${build}/${classes}/${main}">
    <fileset file="${src}/${main}/application-context.xml" />
    <fileset file="${src}/${main}/log4j.xml" />
</jar>

但是包含META-INF文件夹的jar文件。有没有办法排除这个文件夹的创建?


编辑:

完整的build.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<!-- ====================================================================== 
     Aug 14, 2011 6:25:15 PM                                                                           
     Tanmoy                                                                
    ====================================================================== -->
<project name="Number">
    <description>
        Number
    </description>

    <property name="lib" value="lib" />
    <property name="src" value="src" />
    <property name="build" value="build" />
    <property name="classes" value="classes" />
    <property name="jar" value="jar" />
    <property name="jarfilename" value="Number" />
    <property name="client" value="client" />
    <property name="main" value="main" />
    <property name="loader" value="loader" />

    <target name="clean">
        <delete dir="${build}" />
    </target>

    <path id="classpath">
        <fileset dir="${lib}" includes="*.jar" />
    </path> 

    <target name="compile">
        <delete dir="${lib}" />
        <mkdir dir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\swinglabs\swingx-core\1.6.2-2\swingx-core-1.6.2-2.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\springframework\spring-core\3.0.5.RELEASE\spring-core-3.0.5.RELEASE.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\springframework\spring-asm\3.0.5.RELEASE\spring-asm-3.0.5.RELEASE.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\springframework\spring-context\3.0.5.RELEASE\spring-context-3.0.5.RELEASE.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\springframework\spring-aop\3.0.5.RELEASE\spring-aop-3.0.5.RELEASE.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\springframework\spring-beans\3.0.5.RELEASE\spring-beans-3.0.5.RELEASE.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\org\springframework\spring-expression\3.0.5.RELEASE\spring-expression-3.0.5.RELEASE.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\log4j\apache-log4j-extras\1.0\apache-log4j-extras-1.0.jar" todir="${lib}" />
        <copy file="C:\Users\Tanmoy\.m2\repository\log4j\log4j\1.2.9\log4j-1.2.9.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\dj-nativeswing-0.9.8.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\dj-nativeswing-swt-0.9.8.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\dj-swingsuite-0.9.1.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\swt-linux32-3.6.2.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\swt-linux64-3.6.2.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\swt-osx32-3.6.2.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\swt-osx64-3.6.2.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\swt-win32-3.6.2.jar" todir="${lib}" />
        <copy file="F:\Number\Number\jars\swt-win64-3.6.2.jar" todir="${lib}" />

        <mkdir dir="${build}/${classes}/${main}" />
        <javac srcdir="${src}/${main}" destdir="${build}/${classes}/${main}" classpathref="classpath" />

        <mkdir dir="${build}/${classes}/${loader}" />
        <javac srcdir="${src}/${loader}" destdir="${build}/${classes}/${loader}" />
    </target>

    <target name="jar" depends="clean, compile">
        <mkdir dir="${build}/${jar}" />

        <jar destfile="${build}/${jar}/${client}.jar" basedir="${build}/${classes}/${main}">
            <fileset file="${src}/${main}/application-context.xml" />
            <fileset file="${src}/${main}/log4j.xml" />
        </jar>

        <jar destfile="${build}/${jar}/${jarfilename}.${jar}" basedir="${build}/${classes}/${loader}">
            <manifest>
                <attribute name="Main-Class" value="in.res.num.tpb.loader.ClientLoader" />
            </manifest>
            <fileset dir="${build}/${jar}" includes="${client}.jar" />
            <fileset dir="${lib}" includes="*.jar" />
        </jar>

        <delete file="${build}/${jar}/${client}.jar" />
    </target>

    <target name="run" depends="clean, compile, jar">
        <java jar="${build}/${jar}/${jarfilename}.${jar}" fork="true" />
    </target>
</project>

3 个答案:

答案 0 :(得分:2)

使用zip代替jar。为什么要避免使用META-INF文件夹?

答案 1 :(得分:2)

  

有没有办法排除这个文件夹的创建?

没有META-INF文件夹的JAR文件实际上只是一个ZIP文件,因此简单的解决方案是使用Ant <zip>任务。

如果从命令行运行jar命令,看起来像,您可以使用{{1禁止创建MANIFEST.MF文件和(可能)文件夹命令选项;见Jar command manual。但我不知道这实际上是否符合我的想法,并且似乎没有办法让Ant M任务做同样的事情。

但是,就像@JB Nizet一样,我不明白为什么你会关心你的JAR文件中是否有一个冗余文件夹。花时间在一个问题上似乎太微不足道了。

答案 2 :(得分:-1)

Jar总是包含META-INF文件夹,否则它不是有效的jar。但是,由于jar实际上是一个带有其他元信息的ZIP文件(包含在META-INF文件夹中),您只需使用ZIP任务(还可以为生成的文件提供后缀.jar)。请注意,只有使用META-INF,您才能拥有可执行jar(带有主类)或其他JAR功能,如密封包。但是您可以像JAR一样将ZIP添加到类路径中。