2012-12-17 8 views
21

Mamy agenta TeamCity (7.0.3) działającego na 64-bitowym komputerze z systemem Windows Server 2008. Kiedy niedawno zmodernizowane środka do używania Java 7 (1.7.0_10) kompilacje rozpoczęła niepowodzeniem z następującym stacktrace:file.separator Opcja Java 7 powoduje wyjątek ExceptionInitializerError

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) 

Problem wydaje się być spowodowane włączeniem „-Dfile.separator = \” opcja java, którą TeamCity używa w poleceniu wykonywalnym dla agenta. Udało mi się odtworzyć problem, pisząc prostą klasę "Hello World" i kompilując ją w oknie systemu Windows, a następnie uruchamiając program za pomocą opcji file.separator (np. Java -Dfile.separator = \ HelloWorld)

I nie znaleziono żadnych podobnych zgłoszeń błędów. Czy ktoś widział coś takiego? Czy zachowanie pliku file.separator zmieniło się w języku Java 7?

Ponadto zdaję sobie sprawę, że \ jest domyślnie file.separator dla Windows, więc nie sądzę, że agent naprawdę musi go użyć w poleceniu, ale nie widzę sposobu w TeamCity powiedzieć agentowi nie uwzględniać tego. Czy można to zrobić?

+0

Wywoływany jest wyjątekInceptionInitializerError wskazujący, że wystąpił wyjątek podczas oceny statycznego inicjalizatora lub inicjalizatora dla zmiennej statycznej (patrz [tutaj] (http://www.cin.ufpe.br/~java/docs /langspechtml/javalang.doc.html)). Może brakuje ci statycznych bloków. – Seza

+0

Dzięki, ale to nie ma tutaj zastosowania. Program "Hello World", który zawodzi, zawiera tylko jedną główną metodę z System.out.println. – GaZ

+0

użyć \\ zamiast? ale jeśli jest to nowy problem na java 7, może to być błąd – irreputable

Odpowiedz

10

Wygląda na to, że java.exe przycina teraz końcowe \ (ukośnik).

Mam następujący kod: 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") + "|"); 
    } 
} 

zacznę go z Java 1.7.0_07 i _10:

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

i _10

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

I jeszcze jedna seria:

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

i _10

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

Wygląda jak błąd w JVM, i prawdopodobnie nie dotyczy to tylko TeamCity. Poprzednio, jeśli argument kończy się \, nie musieliśmy używać cudzysłowów, parser wiersza poleceń zinterpretował to poprawnie. Teraz musimy przytoczyć takie argumenty. –

+0

Dzięki za małe śledztwo. Podniosłem błąd w Oracle przeciwko 1.7.0_10, więc zobaczymy, co (jeśli coś) się tam stanie. – GaZ

+0

GaZ, czy mógłbyś udostępnić link do problemu tutaj? –

12

Wypróbuj parametr wiersza komend JVM -Dfile.separator=\/ (tj. Podaj zarówno ukośnik do tyłu, jak i do przodu).

+1

To wydaje się naprawić problem dla nas. Dziękuję Ci! –