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/netbeans中定义init之前的常量_Java_Ant_Build_Constants_Build.xml - Fatal编程技术网

Java 在ant/netbeans中定义init之前的常量

Java 在ant/netbeans中定义init之前的常量,java,ant,build,constants,build.xml,Java,Ant,Build,Constants,Build.xml,我有一个要在Tomcat6/JbossAS 5上运行的webapp,出于版本控制的目的,我有几个和目标,它们将执行一组操作来定义一个带有版本号和构建日期时间的常量 目标执行以下操作: <target name="build-config" > <!-- config --> <property name="project.name" value="MY PROJECT" /> <property name="release.pre

我有一个要在Tomcat6/JbossAS 5上运行的webapp,出于版本控制的目的,我有几个和目标,它们将执行一组操作来定义一个带有版本号和构建日期时间的常量

目标执行以下操作:

<target name="build-config" >
    <!-- config -->
    <property name="project.name" value="MY PROJECT" />
    <property name="release.prefix" value="MPROJECT" />
    <property name="release.num" value="1.0" />
    <property name="release.info.file.path" value="org/my/project/Release" />
    <tstamp>
        <format property="release.date" pattern="yyyy-MM-dd HH:mm:ss z" />
    </tstamp>
    <!-- end config -->
    <property name="release.version" value="${release.prefix}-${release.num}" />
    <property name="release.info" value="${release.version} ${release.date}" />
</target>
<target name="build-replace">
    <filter token="release.info" value="${release.version} ${release.date}" />
    <delete file="${src.dir}/${release.info.file.path}.java" />
    <copy file="${src.dir}/${release.info.file.path}.template" tofile="${src.dir}/${release.info.file.path}.java" filtering="true" />
</target>

<target name="build-myproj-1.0.jar" depends="init,buil-config,build-replace,compile">
    <mkdir dir="${dist.dir}"/>
    <jar compress="true" jarfile="${dist.dir}/MPROJECT-1.0.jar">
        <fileset dir="${build.classes.dir}"
               excludes="META-INF/*.*, WEB-INF/classes/*.xml"
               includes="**/*.class"
        />
        <manifest>
            <section name="${project.name}">
                <attribute name="Release-Version" value="${release.version}" />
                <attribute name="Release-Date" value="${release.date}" />
            </section>
        </manifest>
    </jar>
</target>
  • 删除Release.java
  • 将Release.template复制到Release.java,并将版本控制信息正确设置为常量(公共静态最终字符串)
  • 问题是,在编译之前,代码上的常量引用会被替换。比如说,我在哪里

    log.debug("Release: " + Release.info);
    
    使用java反编译器,我可以看到以下内容(假设“TO_BE__DEFINED”是Relase.info的初始值):

    目标如下:

    <target name="build-config" >
        <!-- config -->
        <property name="project.name" value="MY PROJECT" />
        <property name="release.prefix" value="MPROJECT" />
        <property name="release.num" value="1.0" />
        <property name="release.info.file.path" value="org/my/project/Release" />
        <tstamp>
            <format property="release.date" pattern="yyyy-MM-dd HH:mm:ss z" />
        </tstamp>
        <!-- end config -->
        <property name="release.version" value="${release.prefix}-${release.num}" />
        <property name="release.info" value="${release.version} ${release.date}" />
    </target>
    <target name="build-replace">
        <filter token="release.info" value="${release.version} ${release.date}" />
        <delete file="${src.dir}/${release.info.file.path}.java" />
        <copy file="${src.dir}/${release.info.file.path}.template" tofile="${src.dir}/${release.info.file.path}.java" filtering="true" />
    </target>
    
    <target name="build-myproj-1.0.jar" depends="init,buil-config,build-replace,compile">
        <mkdir dir="${dist.dir}"/>
        <jar compress="true" jarfile="${dist.dir}/MPROJECT-1.0.jar">
            <fileset dir="${build.classes.dir}"
                   excludes="META-INF/*.*, WEB-INF/classes/*.xml"
                   includes="**/*.class"
            />
            <manifest>
                <section name="${project.name}">
                    <attribute name="Release-Version" value="${release.version}" />
                    <attribute name="Release-Date" value="${release.date}" />
                </section>
            </manifest>
        </jar>
    </target>
    

    我知道这可能有点让人困惑,如果我遗漏了一些信息,请随时询问

    在编译客户机代码时,是否在客户机代码中替换编译时常量

    要让客户机代码获取常量的新值,可以重新编译所有内容,用getter替换字段,或者使用

    public abstract class Release {
    
    /** Release info */
    public static final String INFO = "TO_BE_DEFINED";
    }