fichier.séparateur Java 7 option provoque ExceptionInInitializerError

Nous avons un agent TeamCity (7.0.3) fonctionnant sur une machine Windows Server 2008 64 bits. Lorsque nous avons récemment mis à niveau L'agent pour utiliser Java 7 (1.7.0_10), les builds ont commencé à échouer avec la stacktrace suivante:

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)

Le problème semble être causé par l'inclusion du " - Dfile.separator = " option java que TeamCity utilise dans la commande exécutable de l'agent. J'ai pu reproduire le problème en écrivant une simple classe "Hello World" et en la compilant sur la boîte Windows, puis l'exécution du programme avec le fichier.option séparateur (c'est-à-dire java-Dfile.séparateur= HelloWorld)

Je n'ai trouvé aucun rapport de bogue similaire. Quelqu'un a vu quelque chose comme cela? A le comportement du fichier.séparateur changé dans Java 7?

De plus, je me rends compte que est le fichier par défaut.separator Pour Windows de toute façon, donc je ne pense pas que l'agent ait vraiment besoin de l'utiliser dans la commande exécutable, mais je ne peux pas voir un moyen dans TeamCity de dire à L'agent de ne pas l'inclure. Est-il possible de le faire cette?

21
demandé sur GaZ 2012-12-17 15:24:22

2 réponses

Il semble java.exe ajuste maintenant fining \ (back-slash).

J'ai le code suivant: importer 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") + "|");
  }
}

Je le démarre avec Java 1.7.0_07 et _10:

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

Et _10

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

Et une série de Plus:

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

Et _10

C:\Java\jdk1.7.0_10\bin\java.exe -cp . -Dprop=z\ test a\ b
agg=a|
agg=b|
prop=z|
10
répondu Eugene Petrenko 2013-03-01 16:21:09

Essayez le paramètre de ligne de commande JVM -Dfile.separator=\/ (c'est-à-dire, spécifiez une barre oblique vers l'arrière et vers l'avant).

12
répondu Michael 2013-02-19 15:39:55