2012-12-17 13 views
21

TeamCity(7.0.3)エージェントは、64ビットWindows Server 2008マシン上で動作しています。我々は最近のJava 7(1.7.0_10)を使用するようにエージェントをアップグレードした場合ビルドするには、次のスタックトレースに失敗しました:file.separator Java 7オプションによりExceptionInInitializerErrorが発生する

Error occurred during initialization of VM 
java.lang.ExceptionInInitializerError 
    at java.lang.Runtime.loadLibrary0(Runtime.java:841) 
    at java.lang.System.loadLibrary(System.java:1084) 
    at java.lang.System.initializeSystemClass(System.java:1145) 
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(String.java:658) 
    at java.io.Win32FileSystem.<init>(Win32FileSystem.java:40) 
    at java.io.WinNTFileSystem.<init>(WinNTFileSystem.java:37) 
    at java.io.FileSystem.getFileSystem(Native Method) 
    at java.io.File.<clinit>(File.java:156) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:841) 
    at java.lang.System.loadLibrary(System.java:1084) 
    at java.lang.System.initializeSystemClass(System.java:1145) 

問題は「-Dfile.separator = \」を含めることによって引き起こされているように見えますTeamCityがエージェントの実行可能コマンドで使用するjavaオプション。私は単純な "Hello World"クラスを作成し、それをWindowsボックスでコンパイルし、次にfile.separatorオプション(つまりjava -Dfile.separator = \ HelloWorld)でプログラムを実行することで問題を再現することができました。

I同様のバグ報告が見つかりませんでした。誰もこれのようなものを見たことがありますか? Java 7でfile.separatorの動作が変更されましたか?

さらに私は、\ Windowsのデフォルトのfile.separatorだとわかっています。エージェントは実際に実行可能コマンドでそれを使用する必要があるとは思わないでしょうが、エージェントに伝えるためにTeamCityの方法を見ることができませんそれを含めることはありません。これは可能ですか?

+0

ExceptionInInitializerErrorは、静的な初期化子または静的変数の初期化子の評価中に例外が発生したことを示すためにスローされます([here](http://www.cin.ufpe.br/~java/docsを参照) /langspechtml/javalang.doc.html))。たぶん静的ブロックが欠けているだけかもしれません。 – Seza

+0

ありがとうございますが、ここでは該当しません。失敗した "Hello World"プログラムには、System.out.printlnを持つ単一のmainメソッドしか含まれていません。 – GaZ

+0

代わりに\\を使用しますか?しかし、これがJava 7の新しい問題であれば、バグ – irreputable

答えて

10

java.exeは、後ろに\(バックスラッシュ)をトリミングするように見えます。

私は次のコードを持っています: import java.lang。*;

public class test { 
    public static void main(String[] argz) { 
    for(String s : argz) { 
    System.out.println("agg=" + s + "|"); 
    } 

    System.out.println("prop=" + System.getProperty("prop") + "|"); 
    } 
} 

私は、Java 1.7.0_07および_10でそれを起動します。

C:\Java\jdk1.7.0_07\bin\java.exe -cp . -Dprop=z\\ test a\\ b 
agg=a\\| 
agg=b| 
prop=z\\| 

と_10

C:\Java\jdk1.7.0_10\bin\java.exe -cp . -Dprop=z\\ test a\\ b 
agg=a| 
agg=b| 
prop=z| 

そして、もう一つのシリーズ:

C:\Java\jdk1.7.0_07\bin\java.exe -cp . -Dprop=z\ test a\ b 
agg=a\| 
agg=b| 
prop=z\| 

と_10

C:\Java\jdk1.7.0_10\bin\java.exe -cp . -Dprop=z\ test a\ b 
agg=a| 
agg=b| 
prop=z| 
+3

JVMのバグのように見えます。おそらく、TeamCityだけが影響を受けるだけではありません。以前は引数が\で終わっている場合は引用符を使用する必要はありませんでしたが、コマンドラインパーサはこれを正しく解釈しました。今我々はそのような議論を引用しなければならない。 –

+0

小さな調査をありがとう。私はOracleとのバグを1.7.0_10に対して提起しました。そこで何が起こったのかがわかります。 – GaZ

+0

GaZ、ここで問題のリンクを共有してください –

12

JVMコマンドラインパラメータ-Dfile.separator=\/を試してください(つまり、スラッシュとスラッシュの両方を指定してください)。

+1

これは私たちにとって問題を解決するようです。ありがとうございました! –

関連する問題