條件屬性被覆蓋
回答
不,你不能覆蓋命令行上設置的屬性。至少,這並不容易。在命令行上覆蓋屬性的全部目的是允許用戶覆蓋默認值,以便按照項目構建的方式進行修改。例如:
<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>
點在${basedir}/lib
目錄螞蟻的contrib罐子。如果您將它檢入到源代碼庫中,它將允許簽出項目的每個人都能夠在不在其系統上安裝ant-contrib的情況下進行構建。
請注意,我定義了一個「ac」XML namespace,所以Ant-Contrib任務不會與其他可能的第三方任務重疊。
螞蟻一旦設置屬性是不可改變的設計。您可以用提供對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
!!作爲userproperties(通過-Dkey = value定義的那些屬性)具有特殊保護。
所以你的要求是「..但是,我不希望用戶能夠從命令行覆蓋條件屬性」。
未填滿。
但是從Ant addon Flaka的let
任務提供possibillity覆蓋甚至userproperties:
<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>
運行都與螞蟻-f yourbuild.xml -Dfoo = BLA腳本,看到了差距。
螞蟻API也有方法project.setUserProperty(字符串,字符串),所以你也可以使用:
...
<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
您必須作出選擇,使用JavaScript開箱即用的腳本任務或Flaka讓任務 oneline解決方案,但需要Flaka jar。
- 1. 屬性文件被屬性任務覆蓋的屬性文件
- 2. Python屬性被覆蓋
- 3. 覆蓋的實例屬性有條件
- 4. 屬性將被以後的屬性文件覆蓋?
- 5. 覆蓋屬性
- 6. 覆蓋屬性
- 7. 覆蓋屬性
- 8. 屬性覆蓋
- 9. 覆蓋屬性
- 10. 覆蓋屬性
- 11. 覆蓋ANT屬性文件
- 12. 覆蓋屬性文件
- 13. 覆蓋事件屬性
- 14. 覆蓋屬性屬性
- 15. Master.cs上的錨href屬性被覆蓋
- 16. 得到一個被覆蓋的屬性
- 17. 如何使CSS屬性不被覆蓋?
- 18. 被覆蓋的CSS屬性取消或只是覆蓋?
- 19. FactoryBoy覆蓋屬性
- 20. 覆蓋屬性CSSStyleDeclaration.textShadow?
- 21. Rails屬性覆蓋
- 22. 覆蓋Form.Text屬性
- 23. 覆蓋類屬性
- 24. 覆蓋css屬性
- 25. 覆蓋HTMLElement.classList屬性
- 26. 覆蓋CSS屬性
- 27. 廚師屬性沒有被覆蓋計算屬性
- 28. 屬性覆蓋「...」不能被解析爲一個屬性上
- 29. 文件被覆蓋
- 30. Android:ArrayList舊條目被新條目覆蓋
覆蓋屬性:[我如何允許一個Ant屬性文件覆蓋在另一個設置的值?](http://stackoverflow.com/questions/4206080/how-can-i-allow-an-ant-property -file到覆蓋最值集合另一個) – Jarekczek