2011-10-14 31 views
0

我有一個Ant任務定義,像這樣:ANT javac的和特殊字符

<javac source="1.5" target="1.5" srcdir="${src.dir}" destdir="${classes.dir}" deprecation="on" debug="on" classpathref="classpath" fork="true" memoryMaximumSize="512m" encoding="UTF-8"> 
     <include name="${app.directory}/**/*.java"/> 
    </javac> 

這工作得很好,但是當我有在其名稱中的特殊字符類它給了我下面的錯誤:

[iosession]  Compiling 131 source files to /C24/PUB/io-stds/trunk/standards/GSIT/build/test/deployment/build/classes 
[iosession]  javac: file not found: /C24/PUB/io-stds/trunk/standards/GSIT/build/test/deployment/src/java/biz/c24/io/minos/AléaChiffréClass.java 
[iosession]  Usage: javac <options> <source files> 
[iosession]  use -help for a list of possible options 
[iosession] Target compile finished 
[iosession] 
[iosession] Building unsuccessful 2 seconds 

當我刪除「fork = true」時,它可以工作,但它忽略了「memoryMaximumSize」設置。我也試過嵌套的方法,但無濟於事。

任何想法?

+0

這裏的問題是,在fork = true的情況下,文件名需要通過操作系統作爲命令行參數傳遞給被調用的'javac'進程。這意味着在螞蟻虛擬機中將字符串轉換爲字節,而在javac虛擬機中則轉換爲另一個字節。 我想這兩個以某種方式使用不同的編碼。 (雖然他們都使用默認編碼,但無法指示編碼)。但我並沒有真正的解決方案。 –

+0

我不知道這是怎麼發生的,但正如Ebermann所說,這是兩個java進程的編碼問題。所以我認爲你可以試試這個:1.使用嵌套的exec任務來執行javac。 2.你也可以嘗試編寫一個自定義任務,使用ProcessBuilder調用javac,這也允許設置env。 |||||在編寫調用本地svn客戶端的svninfo任務時,我有第二種方法的經驗。 – coolcfan

回答

1

這可能不是您所期望的答案,但我的建議是從方法和類的名稱中刪除所有非ASCII字母。我也是講法語的,我從來沒有見過任何一家公司,即使在法國,用法語作爲其發展語言,也接受類名和方法中的重音字母。這只是一種不好的做法,僅僅因爲對於非法語開發者來說,如果沒有鍵盤上的重音符號,就很難使用這些類和方法。

如果你使用一個好的IDE,它應該允許你輕鬆地重構你的代碼。

+0

我希望我可以,但類是由應用程序生成的,所以名稱不能更改:-) – Mossie

+0

@Mossie - 什麼應用程序? –

+0

@Ed Staub - 我們自己的Java應用程序。 – Mossie

0

Apache確認編碼屬性僅適用於文件內容而不適用於文件名。我只是在需要時才恢復使用fork,並保持編碼=「UTF-8」。