java jar的macrodef中的可选sysproperty

时间:2015-01-06 11:52:32

标签: java ant

我尝试编译一个项目: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在这个宏中实际上是可选的?这不是我的项目,我对蚂蚁​​一无所知,所以我将不胜感激如果你能帮助我:)

1 个答案:

答案 0 :(得分:1)

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