条件プロパティを使用して、別のプロパティが定義されている場合はプロパティ値を X に設定し、そうでない場合は Y に設定したいと考えています。ただし、ユーザーがコマンドラインから条件プロパティをオーバーライドできるようにしたくありません。
これはどのように達成できますか?
条件プロパティを使用して、別のプロパティが定義されている場合はプロパティ値を X に設定し、そうでない場合は Y に設定したいと考えています。ただし、ユーザーがコマンドラインから条件プロパティをオーバーライドできるようにしたくありません。
これはどのように達成できますか?
いいえ、コマンド ラインで設定されたプロパティをオーバーライドすることはできません。少なくとも、それは簡単ではありません。コマンド ラインでプロパティをオーバーライドする目的は、プロジェクトのビルド方法を変更するために、ユーザーがデフォルトをオーバーライドできるようにすることです。例えば:
<property file="${basedir}/build.properties"/>
<property name="javac.debug" value="no"/>
<target name="compile">
<javac destdir="${main.destdir}"
debug="${javac.debug}">
デフォルトでは、Java コードはデバッグ情報なしでコンパイルされます。おそらくこれは、jar ファイルを小さくしたり、解釈を高速にしたり、コードを逆コンパイルして読みにくくしたりするために行われます。何らかの理由で、このビルドはデバッグ情報をクラスファイルに入れません。
ただし、開発者はこのデバッグ情報が必要なので、この設定をオーバーライドできるようにしたいと考えています。
$ ant -Djavac.debug=true compile
または、build.properties
ファイルを作成してそこに値を入れることもできます。
このタイプの問題は、ビルドに Ant を使用していない場合に発生します。Ant スクリプトを使用してデプロイを行うサイトをいくつか知っています。Ant は実際にはこの種のことのために作られていないので、私は通常これを思いとどまらせます。たとえば、Ant にはロジックやループが組み込まれていません。プロパティは、一度設定すると変更できません。これらはビルド言語としては良いアイデアですが、汎用プログラミング言語としてはひどいアイデアです。
また、開発者は QA や本番用のビルドを行うべきではありません。これらは、デフォルトを上書きしないビルド サーバーによって実行する必要があります。
さて、このよく考えられたシステム全体を破壊し、絶対的な大混乱を引き起こす方法:
プロジェクトでant-contribタスクを使用できます。これを行うと、Ant Contrib varタスクにアクセスしてプロパティを設定解除できるようになります。
ant-contrib.jar ファイル (最新バージョンに関係なく) をダウンロードし、lib
プロジェクトの下のディレクトリに配置します。次に、これを行うことができます:
<project name="danger-will-robinson" default="package" basedir="."
xmlns:ac="http://ant-contrib.sourceforge.net">
<!-- Define the Ant-Contrib tasks -->
<taskdef=resource="net/sf/antcontrib/antlib.xml"
uri="http://ant-contrib.sourceforge.net">
<classpath>
<fileset dir="${basedir}/lib">
<include name="ant-contrib*.jar"/>
</fileset>
</classpath>
</taskdef>
<!-- Unset Property "foo", so you can use it -->
<ac:var name="foo" unset="true"/>
ディレクトリ<classpath>
内の ant-contrib jar を指すことに注意してください。${basedir}/lib
これをソース リポジトリにチェックインすると、プロジェクトをチェックアウトしたすべての人が、システムに ant-contrib jar をインストールしなくてもビルドできるようになります。
「ac」XML 名前空間を定義したので、Ant-Contrib タスクが他の可能なサードパーティ タスクと重複しないことに注意してください。
一度設定された ant のプロパティは、設計上不変です。Ant API へのアクセスを提供する任意のスクリプト言語 (javascript など) で、既存のプロパティを上書きできます。
JDK >= 1.6 にはすでに JavaScript エンジンが同梱されているため、次のようなものを使用できます。
<project>
<property name="x" value="whatever"/>
<script language="javascript">
project.getProperty('x') ?
project.setProperty('foo', 'true') :
project.setProperty('foo', 'false');
</script>
<echo>$$[foo} => ${foo}</echo>
</project>
箱から出して。
しかし、誰かが使用する場合、それは役に立ちませんant -f yourbuild.xml -Dfoo=bla
!! ユーザープロパティ (-Dkey=value で定義されたプロパティ) には特別な保護があるためです。
したがって、あなたの要件は「..ただし、ユーザーがコマンドラインから条件プロパティをオーバーライドできるようにしたくない」ということです。
満たされていません。
しかし、Ant アドオン Flakalet
のタスクは、ユーザープロパティを上書きする可能性を提供します。
<project xmlns:fl="antlib:it.haefelinger.flaka">
<property name="x" value="whatever"/>
<!--
:= defines a new property whereas
::= overwrites any existing property
even userproperties
-->
<fl:let> foo ::= has.property['x'] ? 'true' : 'false'</fl:let>
<echo>$$[foo} => ${foo}</echo>
</project>
両方のスクリプトを ant -f yourbuild.xml -Dfoo=bla で実行して違いを確認してください。
Ant api にはメソッド project.setUserProperty(String,String) もあるため、以下も使用できます。
...
<script language="javascript">
project.getProperty('x') ?
project.setProperty('foo', 'true') :
project.setProperty('foo', 'false');
project.getUserProperty('x') ?
project.setUserProperty('foo', 'true') :
project.setUserProperty('foo', 'false');
</script>
...
foo プロパティが .. -D .. 経由で設定されるのを防ぐため、プロパティ x がコマンドラインで定義されていても機能します-Dx=whateverワンライン ソリューションですが、Flaka jar が必要です。