21

我们有一个在 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)来重现该问题

我还没有发现任何类似的错误报告。有没有人见过这样的事情?Java 7 中 file.separator 的行为是否发生了变化?

此外,我意识到 \ 无论如何都是 Windows 的默认 file.separator,所以我认为代理确实不需要在可执行命令中使用它,但是我在 TeamCity 中看不到告诉代理不要包含它的方法. 是否有可能做到这一点?

4

2 回答 2

12

尝试使用 JVM 命令行参数-Dfile.separator=\/(即,同时指定反斜杠和正斜杠)。

于 2012-12-22T11:23:25.940 回答
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|
于 2012-12-27T13:40:50.043 回答