2012-12-17 8 views
21

Abbiamo un agente TeamCity (7.0.3) in esecuzione su un computer Windows Server 2008 64-bit. Quando di recente abbiamo aggiornato l'agente di usare Java 7 (1.7.0_10) le generazioni iniziato non riuscendo con il seguente stacktrace:file.separator L'opzione Java 7 causa ExceptionInInitializerError

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) 

Il problema sembra essere causato da l'inclusione del "-Dfile.separator = \" opzione java che TeamCity utilizza nel comando eseguibile per l'agente. Sono stato in grado di riprodurre il problema scrivendo una semplice classe "Hello World" e compilarla sulla casella di Windows e quindi eseguire il programma con l'opzione file.separator (ad esempio java -Dfile.separator = \ HelloWorld)

I non ho trovato segnalazioni di bug simili. Qualcuno ha mai visto qualcosa del genere? Il comportamento di file.separator è cambiato in Java 7?

Inoltre mi rendo conto che \ è il file.separator predefinito per Windows in ogni caso quindi non penso che l'agente abbia realmente bisogno di usarlo nel comando eseguibile, tuttavia non riesco a vedere un modo in TeamCity per dire all'agente non includerlo. È possibile farlo?

+0

Un oggetto ExceptionInInitializerError viene generato per indicare che si è verificata un'eccezione durante la valutazione di un inizializzatore statico o dell'inizializzatore per una variabile statica (vedere [qui] (http://www.cin.ufpe.br/~java/docs /langspechtml/javalang.doc.html)). Forse ti mancano solo blocchi statici. – Seza

+0

Grazie, ma questo non si applica qui. Il programma "Hello World" che fallisce contiene solo un singolo metodo principale con System.out.println. – GaZ

+0

utilizza \\ invece? ma se questo è un nuovo problema su java 7, potrebbe essere un errore – irreputable

risposta

10

Sembra che java.exe ora ritiri il trailing \ (back-slash).

Ho il seguente codice: importazione 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") + "|"); 
    } 
} 

lo inizio con Java 1.7.0_07 e _10:

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

e _10

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

E ancora una serie:

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

e _10

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

Sembra un bug in JVM e probabilmente non è interessato solo TeamCity. In precedenza, se l'argomento termina con \ non abbiamo dovuto usare virgolette, il parser della riga di comando lo ha mangiato correttamente. Ora dobbiamo citare tali argomenti. –

+0

Grazie per la piccola indagine. Ho sollevato il bug con Oracle contro 1.7.0_10, quindi vedremo cosa succede (se non altro). – GaZ

+0

GaZ, ti preghiamo di condividere il link di emissione qui –

12

Provare il parametro della riga di comando JVM -Dfile.separator=\/ (ad esempio, specificare una barra sia in avanti che in avanti).

+1

Questo sembra risolvere il problema per noi. Grazie! –