java jar 的 macrodef 中的可选 sysproperty

Optional sysproperty in macrodef for java jar

有一个项目我尝试编译:https://github.com/real-logic/simple-binary-encoding 但是,当我尝试使用带有 cpp98 目标的 ant 进行编译时,编译失败。经过大量分析,它失败了,因为 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 在这个宏中实际上是可选的?这不是我的项目,我对 ant 一无所知,所以如果你能帮助我,我将不胜感激。 :)

看到 <schemafiles/> 了吗?这是由 <element.../> 定义的,而不是宏定义中的 <attribute.../>。没有理由不能以相同的方式定义您的系统属性。

当然,您也必须更改对宏的调用。这意味着如果有人想要设置系统属性,他们必须将那些 <sysproperties/> 行放在他们的宏调用中(如果他们想要设置的话)。假设宏定义为:

<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>