2012-12-17 32 views
21

Chúng tôi có một đại lý TeamCity (7.0.3) chạy trên máy Windows Server 2008 64 bit. Khi chúng tôi vừa mới nâng cấp các đại lý để sử dụng Java 7 (1.7.0_10) các bản xây dựng bắt đầu thất bại với stacktrace sau:tệp.separator Tùy chọn Java 7 gây ra 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) 

Vấn đề dường như được gây ra bởi sự bao gồm của các "-Dfile.separator = \" tùy chọn java mà TeamCity sử dụng trong lệnh thực thi cho tác nhân. Tôi đã có thể tái tạo vấn đề bằng cách viết một lớp "Hello World" đơn giản và biên dịch nó trên hộp Windows và sau đó chạy chương trình với tùy chọn file.separator (ví dụ java -Dfile.separator = \ HelloWorld)

I không tìm thấy bất kỳ báo cáo lỗi tương tự nào. Đã ai thấy cái gì như thê chưa? Có hành vi của file.separator thay đổi trong Java 7?

Hơn nữa, tôi nhận ra rằng \ mặc định là tệp.separator cho Windows nên tôi không nghĩ rằng tác nhân thực sự cần sử dụng nó trong lệnh thực thi, tuy nhiên tôi không thể thấy cách trong TeamCity để báo cho đại lý không bao gồm nó. có khả năng làm cái này không?

+0

Một ExceptionInInitializerError được ném để cho biết rằng một ngoại lệ xảy ra trong quá trình đánh giá bộ khởi tạo tĩnh hoặc bộ khởi tạo cho biến tĩnh (xem [đây] (http://www.cin.ufpe.br/~java/docs /langspechtml/javalang.doc.html)). Có thể bạn chỉ thiếu các khối tĩnh. – Seza

+0

Cảm ơn, nhưng điều đó không áp dụng ở đây. Chương trình "Hello World" không thành công chỉ chứa một phương thức chính với System.out.println. – GaZ

+0

sử dụng \\ thay thế? nhưng nếu đây là một vấn đề mới trên java 7, nó có thể là một lỗi – irreputable

Trả lời

10

Dường như java.exe hiện đang cắt đường mòn \ (dấu gạch chéo ngược).

Tôi có mã sau: nhập 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") + "|"); 
    } 
} 

tôi bắt đầu nó với Java 1.7.0_07 và _10:

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

và _10

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

Và thêm một loạt:

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

và _10

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

Trông giống như một lỗi trong JVM, và có lẽ không chỉ TeamCity bị ảnh hưởng. Trước đây nếu đối số kết thúc bằng \ chúng ta không phải sử dụng dấu ngoặc kép, thì trình phân tích cú pháp dòng lệnh đã ăn chính xác điều này. Bây giờ chúng ta phải trích dẫn những lập luận như vậy. –

+0

Cảm ơn vì điều tra nhỏ. Tôi đã đưa ra lỗi với Oracle chống lại 1.7.0_10, vì vậy chúng tôi sẽ xem những gì (nếu có) xảy ra ở đó. – GaZ

+0

GaZ, bạn vui lòng chia sẻ liên kết vấn đề tại đây –

12

Hãy thử tham số dòng lệnh JVM -Dfile.separator=\/ (tức là, chỉ định cả dấu gạch chéo ngược và tiến).

+1

Điều này dường như khắc phục được sự cố cho chúng tôi. Cảm ơn bạn! –

Các vấn đề liên quan