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.../>
。例如,您可能需要 outputdir
。 targetlanguage
,甚至 validationxsd
是属性,而其他一切都是元素。然后,如果 targetlanguage
未设置,则设置默认值 java
,并测试是否设置了 outputdir
和 validationxml
,如果未设置,则失败:
<fail message="Must set "outputdir" and "validationxsd".">
<condition>
<or>
<equals arg1="@{outputdir}" arg2=""/>
<equals arg1="@{validationxml}" arg2=""/>
</or>
</condition>
</fail>
有一个项目我尝试编译: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.../>
。例如,您可能需要 outputdir
。 targetlanguage
,甚至 validationxsd
是属性,而其他一切都是元素。然后,如果 targetlanguage
未设置,则设置默认值 java
,并测试是否设置了 outputdir
和 validationxml
,如果未设置,则失败:
<fail message="Must set "outputdir" and "validationxsd".">
<condition>
<or>
<equals arg1="@{outputdir}" arg2=""/>
<equals arg1="@{validationxml}" arg2=""/>
</or>
</condition>
</fail>