file.separator Java 7选项导致ExceptionInInitializerError

GaZ*_*GaZ 21 java windows teamcity 64-bit jvm

我们有一个在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)
Run Code Online (Sandbox Code Playgroud)

该问题似乎是由于TeamCity在代理的可执行命令中使用了"-Dfile.separator = \"java选项引起的.我能够通过编写一个简单的"Hello World"类并在Windows框中编译它然后使用file.separator选项运行程序(即java -Dfile.separator =\HelloWorld)来重现该问题.

我没有找到任何类似的错误报告.有没有人见过这样的东西?在Java 7中是否更改了file.separator的行为?

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

小智 12

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


Eug*_*nko 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") + "|");
  }
}
Run Code Online (Sandbox Code Playgroud)

我从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\\|
Run Code Online (Sandbox Code Playgroud)

和_10

C:\Java\jdk1.7.0_10\bin\java.exe -cp . -Dprop=z\\ test a\\ b
agg=a|
agg=b|
prop=z|
Run Code Online (Sandbox Code Playgroud)

还有一个系列:

C:\Java\jdk1.7.0_07\bin\java.exe -cp . -Dprop=z\ test a\ b
agg=a\|
agg=b|
prop=z\|
Run Code Online (Sandbox Code Playgroud)

和_10

C:\Java\jdk1.7.0_10\bin\java.exe -cp . -Dprop=z\ test a\ b
agg=a|
agg=b|
prop=z|
Run Code Online (Sandbox Code Playgroud)

  • 看起来像JVM中的一个错误,可能不仅仅是TeamCity受到影响.以前,如果参数以\结尾,我们不必使用引号,命令行解析器正确地使用它.现在我们必须引用这些论点. (3认同)