我们在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)
问题似乎是由于TeamCity在代理的可执行命令中使用了“-Dfile.separator = \”java选项而引起的。我能够通过编写一个简单的“Hello World”类并在Windows框中编译它然后使用file.separator选项运行程序(即java -Dfile.separator = \ HelloWorld)来重现问题
我没有找到任何类似的错误报告。有没有人见过这样的东西?在Java 7中是否更改了file.separator的行为?
此外我意识到\无论如何都是Windows的默认file.separator所以我不认为代理确实需要在可执行命令中使用它,但是我在TeamCity中看不到告诉代理的方法包括它。有可能这样做吗?
答案 0 :(得分:12)
尝试使用JVM命令行参数-Dfile.separator=\/
(即同时指定反斜杠和正斜杠)。
答案 1 :(得分: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") + "|");
}
}
我用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|