Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Ant Contrib If用于可选JAR META-INF_Java_Ant_Jar_Ant Contrib_Meta Inf - Fatal编程技术网

Java Ant Contrib If用于可选JAR META-INF

Java Ant Contrib If用于可选JAR META-INF,java,ant,jar,ant-contrib,meta-inf,Java,Ant,Jar,Ant Contrib,Meta Inf,我有一个场景,我试图在多个项目中重用相同的build.xml文件。在每种情况下,最终的目标都是一个dist,它会把所有内容都搅乱。唯一的区别是,一些项目有src/main/java/META-INF/*目录,而其他项目没有(并且只有src/main/java/*目录) 如果构建看到可用的src/main/java/META-INF/*目录,我想使用Ant Contrib任务来选择性地定义META-INF/目录。比如说: <jar jarfile="myapp.jar"> &l

我有一个场景,我试图在多个项目中重用相同的
build.xml
文件。在每种情况下,最终的目标都是一个
dist
,它会把所有内容都搅乱。唯一的区别是,一些项目有
src/main/java/META-INF/*
目录,而其他项目没有(并且只有
src/main/java/*
目录)

如果构建看到可用的
src/main/java/META-INF/*
目录,我想使用Ant Contrib
任务来选择性地定义
META-INF/
目录。比如说:

<jar jarfile="myapp.jar">
    <if>
        <available file="src/main/java/META-INF" />
        <then>
            <!--
                Copy everything from src/main/java/META-INF into
                the JAR's META-INF directory.

                But how?!?
            -->
            <echo message="I'm trying to copy META-INF!" />
        </then>
    </if>
</jar>

但有两件事让我窒息了:

  • 当我运行这个目标时,我得到一个生成异常,声明我不能在
    任务中嵌套
    ;及
  • 我不知道如何配置
    任务,在类路径的根目录下创建
    META-INF
    目录,并将所有
    src/main/java/META-INF
    内容复制到其中

  • 有什么想法吗?提前感谢。

    消息是正确的,因为
    本身就是一个任务,您不能在
    任务中嵌套其他任务。但是,您可以使用
    任务定义一个具有ID的合适文件集,然后使用refid将其包含在JAR中:

    <if>
        <available file="src/main/java/META-INF" />
        <then>
            <fileset id="src.metainf" dir="src/main/java/META-INF" />
        </then>
        <else>
            <fileset id="src.metainf" dir="." excludes="**/*" />
        </else>
    </if>
    
    <jar destfile="myapp.jar">
        <metainf refid="src.metainf" />
    </jar>
    
    
    
    实际上,你不需要这个来回答这个特定的问题,但在其他情况下,这是一个需要注意的有用技巧。我发现在定义
    元素而不是文件集时,它更有用。

    您让它变得比必要的更难。只需使用以下任务,META-INF文件夹(如果存在)将包含在jar中,如果不存在则忽略:

    <target name="dist">
        <jar destfile="test.jar">
            <fileset dir="classes"/> <-- or whatever directory you want to put in the jar -->
            <metainf dir="src/main/java/META-INF" erroronmissingdir="false"/>
        </jar>
    </target>
    

    听起来您希望利用更模块化的构建配置。有两个目标如何:

    <target name="jar">
        <!-- Normal JAR tasks like you currently have (sans the metainf stuff). -->
    </target>
    
    <target name="jar-with-metainf">
        <jar destfile="test.jar">
            <fileset dir="classes"/>
            <metainf dir="src/main/java/META-INF"/>
        </jar>
    </target>
    
    
    

    然后,当您想要构建包含
    META-INF/
    的项目时,您只需使用metainf运行
    jar

    ,这样您就可以在jar中包含来自其他目录的类,并且还可以选择将src/main/java/META-INF的内容作为META-INF包含在内?如果是这样,您可以在jar任务中使用metainf嵌套元素。清单是其中一个文件吗?谢谢@martin clayton(+1)-我当然不反对使用
    manifest.MF
    ,但目前我的项目没有清单(至少没有我明确定义的清单)。所以,如果我必须创建一个虚拟/空白的manfiest,或者让Ant为我创建一个,我可以这样做。但要回答您的问题:不,清单当前不是其中一个文件。