Подтвердить что ты не робот

File.separator Параметр Java 7 вызывает ExceptionInInitializerError

У нас есть агент TeamCity (7.0.3), работающий на 64-разрядной машине Windows Server 2008. Когда мы недавно обновили агент для использования Java 7 (1.7.0_10), сборки начали сбой со следующей командой stacktrace:

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 = \" java, которую TeamCity использует в исполняемой команде для агента. Я смог воспроизвести проблему, написав простой класс Hello World и скомпилировав его в окне Windows, а затем запустил программу с опцией file.separator(то есть java -Dfile.separator =\HelloWorld)

Я не нашел подобных отчетов об ошибках. Кто-нибудь видел что-нибудь подобное? Изменено ли поведение файла.сепаратора в Java 7?

Кроме того, я понимаю, что\является файлом default.separator для Windows в любом случае, поэтому я не думаю, что агент действительно должен использовать его в исполняемой команде, однако я не вижу способа в TeamCity сообщить агенту не включить его. Можно ли это сделать?

4b9b3361

Ответ 1

Похоже, java.exe теперь обрезает trailing\(back-slash).

У меня есть следующий код:   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|

Ответ 2

Попробуйте параметр командной строки JVM -Dfile.separator=\/ (т.е. укажите как обратную, так и прямую косую черту).