2012-12-17 3 views
21

TeamCity (7.0.3) 에이전트가 64 비트 Windows Server 2008 시스템에서 실행되고 있습니다.file.separator Java 7 옵션으로 인해 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) 

문제는 "-Dfile.separator = \"의 포함에 의한 것으로 보인다 : 우리가 최근에 (1.7.0_10)를 자바 7을 사용하는 에이전트를 업그레이드 한 빌드 할 때 다음과 같은 스택 추적에 실패 시작 TeamCity가 에이전트의 실행 가능 명령에서 사용하는 java 옵션. 간단한 "Hello World"클래스를 작성하고 Windows 상자에서 컴파일 한 다음 file.separator 옵션 (예 : java -Dfile.separator = \ HelloWorld)을 사용하여 프로그램을 실행하여 문제를 재현 할 수있었습니다.

비슷한 버그 리포트를 찾지 못했습니다. 이걸 본 사람 있어요? Java 7에서 file.separator의 동작이 변경 되었습니까?

또한 \는 Windows 용 기본 file.separator입니다. 어쨌든 에이전트가 실제로 실행 가능한 명령에서 사용해야한다고 생각하지 않지만, TeamCity에서 에이전트에게 알릴 수는 없습니다. 그것을 포함하지 말라. 이것을 할 수 있습니까?

+0

ExceptionInInitializerError는 정적 변수에 대한 정적 초기화 프로그램이나 초기화 프로그램을 평가하는 동안 예외가 발생했음을 나타 내기 위해 throw됩니다 ([here] (http://www.cin.ufpe.br/~java/docs 참조) /langspechtml/javalang.doc.html)). 어쩌면 당신은 정적 블록이 부족할 수도 있습니다. – Seza

+0

감사합니다. 그러나 여기서는 적용되지 않습니다. 실패한 "Hello World"프로그램에는 System.out.println이있는 단일 기본 메소드 만 들어 있습니다. – GaZ

+0

대신 \\을 사용 하시겠습니까? 그러나 이것이 Java 7의 새로운 문제라면, 버그 일 수 있습니다. – irreputable

답변

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") + "|"); 
    } 
} 

나는 자바 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| 
+3

JVM의 버그처럼 보입니다. 아마도 TeamCity뿐만 아니라 영향을받을 것입니다. 이전에 인수가 \로 끝나면 따옴표를 사용할 필요가 없었으므로 명령 줄 구문 분석기가 올바르게 계산했습니다. 이제 우리는 그러한 주장을 인용해야합니다. –

+0

작은 조사를 해줘서 고마워. 필자는 1.7.0_10에 대한 오라클의 버그를 제기 했으므로 (있는 경우) 무엇이 발생하는지 살펴 보겠습니다. – GaZ

+0

GaZ, 제발 여기에 문제 링크를 공유 하시겠습니까 –

12

JVM 명령 줄 매개 변수 -Dfile.separator=\/을 사용해보십시오 (즉, 역 슬래시와 슬래시를 모두 지정하십시오).

+1

이것은 우리 문제를 해결하는 것으로 보입니다. 고맙습니다! –

관련 문제