我尝试哟编译一个项目:https://github.com/real-logic/simple-binary-encoding
但是,当我尝试使用ant和cpp98的目标进行编译时,编译失败。经过大量分析后,它失败了,因为build.xml中的某个宏在启动jar时试图具有可选的sysproperty,但未能成功。

这是一个有效的build.xml,它是导致项目失败(但它需要启动几个文件)的原因的摘录:

<project name="optional-sysproperty" default="test" basedir="." xmlns:unless="ant:unless">
    <macrodef name="sbetool">
        <attribute name="outputdir" default=""/>
        <attribute name="targetlanguage" default=""/>
        <attribute name="targetnamespace" default=""/>
        <attribute name="generatestubs" default=""/>
        <attribute name="generateir" default=""/>
        <attribute name="validationxsd" default=""/>
        <attribute name="stoponerror" default=""/>
        <element name="schemafiles" implicit="yes" />
        <sequential>
            <java jar="sbe.jar" failonerror="true" fork="true">
                <sysproperty key="sbe.output.dir" value="@{outputdir}"/>
                <sysproperty key="sbe.target.language" value="@{targetlanguage}" unless:blank="@{targetlanguage}"/>
                <sysproperty key="sbe.target.namespace" value="@{targetnamespace}" unless:blank="@{targetnamespace}"/>
                <sysproperty key="sbe.generate.stubs" value="@{generatestubs}" unless:blank="@{generatestubs}"/>
                <sysproperty key="sbe.generate.ir" value="@{generateir}" unless:blank="@{generateir}"/>
                <sysproperty key="sbe.validation.xsd" value="@{validationxsd}" unless:blank="@{validationxsd}"/>
                <sysproperty key="sbe.validation.stop.on.error" value="@{stoponerror}" unless:blank="@{stoponerror}"/>
                <schemafiles/>
            </java>
        </sequential>
    </macrodef>

    <target name="test"
            description="Generate serialized IR stubs for Java">
        <sbetool outputdir="${basedir}" targetlanguage="Java"
            validationxsd="SimpleBinary1-0.xsd">
            <arg value="sbe-test.xml"/>
        </sbetool>
    </target>
</project>


使用ant -v启动时,我得到以下信息:

test:
     [java] Executing '/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java' with arguments:
     [java] '-Dsbe.output.dir=/home/adrien'
     [java] '-Dsbe.target.language=Java'
     [java] '-Dsbe.target.namespace='
     [java] '-Dsbe.generate.stubs='
     [java] '-Dsbe.generate.ir='
     [java] '-Dsbe.validation.xsd=SimpleBinary1-0.xsd'
     [java] '-Dsbe.validation.stop.on.error='
     [java] '-jar'
     [java] '/home/adrien/sbe.jar'
     [java] 'sbe-test.xml'
     [java]
     [java] The ' characters around the executable and arguments are
     [java] not part of the command.

BUILD SUCCESSFUL
Total time: 1 second


sysproperties已与空值一起使用,这不是此macrodef的目标。在此目标上构建成功后,由于这些空的sysproperties,jar无法创建必要的文件。从此项目文档(https://github.com/real-logic/simple-binary-encoding/wiki/Sbe-Tool-Guide)中,不应使用其中某些属性,尤其是:

sbe.target.namespace: Namespace to be used for generated code. Equates package for Java. If not provided then the package attribute from the schema will be used.


综上所述,我的问题是是否有办法使这些sysproperties在此宏中实际上是可选的?这不是我的项目,我对蚂蚁​​一无所知,因此,如果您能帮助我,我将不胜感激。 :)

最佳答案

看到那个<schemafiles/>吗?那是由<element.../>定义的,而不是您的宏定义中的<attribute.../>。没有理由不能同样定义您的系统属性。

当然,您也必须将对宏的调用更改为。这意味着,如果某人想要设置系统属性,则如果要设置它们,则必须将这些<sysproperties/>行放入其Macro调用中。假设宏定义为:

<macrodef name="sbetool">
    <element name="sysproperties"/>
    <element name="schemafiles"/>    <!-- Note "implicit" has been removed-->


如果我想要这些系统属性,则必须在调用中进行:

<sbetool>
    <sysproperties>
         <sysproperty key="sbe.output.dir" value="..."/>
         <sysproperty key="sbe.target.language" value="..."/>
         <sysproperty key="sbe.target.namespace" value="..."/>
    <sysproperties/>
     <schemafiles>
         <arg value="sbe-test.xml"/>
     <schemafiles/>
</sbetool>


如果必须将某些值设置为某种值,请将其设置为具有默认值的<attribute.../>。如果某些内容是可选的,请将其设置为<element.../>。例如,您可能需要outputdirtargetlanguage,甚至validationxsd都是属性,而其他所有元素都是元素。然后,如果未设置targetlanguage,则设置默认值java,然后测试以查看是否设置了outputdirvalidationxml,如果未设置,则失败:

<fail message="Must set &quot;outputdir&quot; and &quot;validationxsd&quot.">
    <condition>
        <or>
            <equals arg1="@{outputdir}" arg2=""/>
            <equals arg1="@{validationxml}" arg2=""/>
        </or>
    </condition>
</fail>

08-05 11:33