0

Tomcat6/JbossAS 5 で実行する webapp があり、バージョン管理の目的で、一連の操作を実行してバージョン番号とビルド日時で定数を定義するいくつかの AND ターゲットがあります。

ターゲットは次のことを実行します。

  1. Release.java を削除します。
  2. Release.template を Release.java にコピーし、バージョン管理情報を定数として適切に設定します (public static final String)

問題は、定数参照がコンパイル前にコードで置き換えられることです。たとえば、私が持っている場所

log.debug("Release: " + Release.info);

Java 逆コンパイラを使用して、次のことを確認できます (「TO_BE_DEFINED」が Relase.info の初期値であると仮定しましょう):

log.debug("Release: TO_BE_DEFINED");

ターゲットは次のとおりです。

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

私のクラスは次のように定義されています

public abstract class Release {

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

少しわかりにくいかもしれませんが、情報が不足している場合はお気軽にお問い合わせください

4

1 に答える 1

1

コンパイル時の定数は、クライアント コードがコンパイルされるときに、クライアント コードで置き換えられます。

クライアントコードに定数の新しい値を取得させるには、すべてを再コンパイルするか、フィールドをゲッターに置き換えるか、この質問の戦略のいずれかを使用します

于 2012-06-18T10:31:32.243 に答える