我们在一台64位Windows Server 2008机器上运行一个TeamCity (7.0.3)代理。最近,当我们将代理升级以使用Java 7 (1.7.0_10)时,构建开始失败,并显示以下堆栈跟踪:
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)
问题似乎源于TeamCity在代理程序的可执行命令中使用的"-Dfile.separator=\" java选项。我能够通过编写一个简单的“Hello World”类并在Windows机器上编译它,然后使用file.separator选项运行程序(即java -Dfile.separator=\ HelloWorld)来重现该问题。
我没有找到任何类似的错误报告。有人见过这样的情况吗?file.separator的行为在Java 7中有改变吗?
此外,我意识到\实际上是Windows的默认file.separator,所以我不认为代理程序真的需要在可执行命令中使用它,但我无法在TeamCity中找到一种方法告诉代理程序不要包含它。有可能做到这一点吗?