【问题标题】:Ant Build Jar without META-INF没有 META-INF 的 Ant Build Jar
【发布时间】:2011-10-31 13:21:20
【问题描述】:

如何在没有 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>

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


编辑:

完整的 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>

【问题讨论】:

    标签: java ant jar meta-inf


    【解决方案1】:

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

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

    如果您从命令行运行jar 命令,看起来像您可以使用M 命令选项禁止创建 MANIFEST.MF 文件和(可能)文件夹;见Jar command manual。但我不知道这是否真的像我认为的那样做,而且似乎没有办法让 Ant &lt;jar&gt; 任务做同样的事情。

    但是,就像@JB Nizet 一样,我不明白您为什么会关心您的 JAR 文件中是否有一个冗余文件夹。这个问题似乎太琐碎了,不能花时间去解决。

    【讨论】:

    • 四年后仅仅使用 StackOverflow 作为记录的讨论,关心的一个原因是 MSOffice 关心。您可以解压缩一个 .pptx 文件,以编程方式对其进行修改并重新压缩它,它可以在 PowerPoint 中正常打开……但前提是您使用 -M 选项。,
    • 好吧,假设您尝试使用 Ant 构建“.pptx”文件,那么这将是不使用 &lt;jar&gt; 的理由。然而,这有点牵强。有没有更合理的用例?
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    使用zip 而不是jar。为什么要避免使用 META-INF 文件夹?

    【讨论】:

    • 我正在使用stackoverflow.com/questions/2706222/… 中讨论的方法构建一个 jar。我在原始帖子中给出了蚂蚁脚本。它正在创建 META-INF jar。一个在 Number.jar 中,另一个在 Number.jar/client.jar 中。我认为client.jar中不需要有一个META-INF文件夹。
    • 我的意思是:即使 META-INF 文件夹不是必需的,你为什么要关心它?拥有一个不会使您的应用程序崩溃。它不会使罐子变大两倍。你只是不应该关心它。
    • +1 谢谢你,但不幸的是我不能接受这个答案。 @Stephen C 给出的答案同样有帮助。但是 Stackoverflow 有规则只接受一个答案,(不知道为什么我不能接受两个或多个相同或不同的同样可接受的答案)。我在这个thread 中与camickr 进行了一些聊天,但不太好。我没有抱怨任何事情,但我认为改变接受答案的规则会更好。
    • @Tapas:规则不是我的(也不是 camickr 的)。我和你一样只是一个简单的用户。如果您想投诉或询问有关 StackOverflow 的问题,只需将其发布到 meta.stackoverflow.com。如果您认为斯蒂芬的答案是最好的,那就接受它。你不必找借口。我们都知道游戏规则,并且在这里提供帮助,而不是获得积分。
    • 感谢您的回复,我会在meta中发帖。我没有任何借口,但有些人来这里是为了获得积分而不是帮助。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2015-06-20
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多