2016-08-08 9 views
4

패키지 된 병을 시작할 때이 오류가 발생합니다. IDE에서 실행하면 오류가 발생하지 않고 실행됩니다.파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다. - Kotlin - Maven

java.io.FileNotFoundException: file:\C:\Development\Kotlin\AccountTool\target\AccountTool-1.0-SNAPSHOT-jar-with-dependencies.jar!\accounts.json (The filename, directory name or volume label syntax is incorrect) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileReader.<init>(Unknown Source) 
    at com.martacus.accounttool.ToolView$handler.readData(Tool.kt:41) 
    at com.martacus.accounttool.ToolView.<init>(Tool.kt:56) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at tornadofx.FXKt.find(FX.kt:238) 
    at tornadofx.App.start(App.kt:27) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$52/31866147.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/2900468.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/4210449.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/24077489.run(Unknown Source) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/1828305.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
IDE에서

코드 및 파일 계층 구조 : enter image description here

fun readData(){ 
    accounts.clear() 
    var readFile = ToolView::class.java.classLoader.getResource("accounts.json").file 
    println(readFile) 
    FileReader(readFile).use{ 
     var account = gson.fromJson(it, Array<Account>::class.java) ?: return 
     for(i in account){ 
      accounts.add(i) 
     } 
    } 

} 

의 .jar 루트 : 내가 잘못 가고 그리고 왜주는 무엇인지 전혀 모른다

enter image description here

나 오류. stackoverflow 및 Google 검색 올바른 대답을 날 제공하지 않았다. 더 많은 정보가 필요하면 여기 누군가가 나를 도울 수 있기를 바랍니다. 그렇게 말하십시오.

감사합니다.

답변

5

리소스가 jar로 압축되면 더 이상 파일 시스템에서 파일로 사용할 수 없습니다. 따라서 파일 시스템 작업에 표준 API를 사용하여 File() 또는 FileReader()으로 자원 내용에 액세스 할 수 없습니다.

이 대신 당신이 Class.getResourceAsStream 또는 ClassLoader.getResourceAsStream 방법과 리소스 스트림을 열고 그 스트림의 콘텐츠 읽어야

val stream = ToolView::class.java.classLoader.getResourceAsStream("accounts.json") 

stream.reader().use { 
    println(it.readText()) 
} 
+1

그것은 또한 접두사해야 할 수 있습니다를'/는'/ accounts.json''등이 있기 때문에 ToolView와 동일한 패키지가 아닙니다 (ToolView가 어떤 패키지인지 다시 알 수 없습니다). 또는 대신 시스템 클래스 로더를 사용하십시오. –

+0

@JaysonMinard'getResourceAsStream'이 패키지와 관련하여 리소스의 이름을 결정하는'Class' 인스턴스에서 호출 될 때 필요하다고 생각합니다. 그리고 여기에서'getResourceAsStream'은'ClassLoader'에서 호출됩니다. 그러나 어쨌든 명확히 해 주셔서 감사합니다. – Ilya

+0

감사! 그것은 작동합니다! 그러나 이것은 WriteFile에도 적용됩니까? 내가 글을 쓸 때 실수를 범했기 때문에 나는 변하지 않았다. Atlough 난 stream.writer() 메서드를 참조하십시오. – Martacus