2017-06-05 15 views
0

私のアプリケーションからリソースファイルを読み込もうとしましたが、動作しません。Java getリソースが機能しない

コード:

ファイル:/ C:!の/Users/username/Repo/run/Application.jar /test.xsd Iは、JARファイルを実行し

String filename = getClass().getClassLoader().getResource("test.xsd").getFile(); 
System.out.println(filename); 
File file = new File(filename); 
System.out.println(file.exists()); 

出力

それは私がジャーファイルを実行すると、私はIntelliJのからアプリケーションを実行したときに動作しますが、ありません。 jarファイルを7-zipで開くと、test.xsdはルートフォルダにあります。 jarファイルを実行するときにコードが機能しないのはなぜですか?

+0

classesフォルダの中に「test.xsd」に移動してください。ご覧のように、クラスパス内のファイルを検索するgetClassLoader()を呼び出します。 –

+0

jarファイルの内容を調べることができますか?ファイルがjarファイルにパッケージ化されています –

+0

IntelliJがルートフォルダをクラスパスとして追加している可能性があります –

答えて

1

また、Fileは、実際のOSファイルシステムファイルを指します。 OSのファイルシステムには、jarファイルのみがあり、jarファイルはフォルダではありません。 URLの内容を一時ファイルに抽出するか、メモリ内のバイトまたはストリームとして操作する必要があります。

myURL.getFile()が実際のFileではなく、文字列表現を返していることに注意してください。同様に、このうない作品:

File f = new URL("http://www.example.com/docs/resource1.html").getFile(); 
f.exists(); // always false - will not be found in the local filesystem 

素敵なラッパーは次のようになります。

public static File openResourceAsTempFile(ClassLoader loader, String resourceName) 
     throws IOException { 
    Path tmpPath = Files.createTempFile(null, null); 
    try (InputStream is = loader.getResourceAsStream(resourceName)) { 
     Files.copy(is, tmpPath, StandardCopyOption.REPLACE_EXISTING); 
     return tmpPath.toFile(); 
    } catch (Exception e) { 
     if (Files.exists(tmpPath)) Files.delete(tmpPath); 
     throw new IOException("Could not create temp file '" + tmpPath 
       + "' for resource '" + resourceName + "': " + e, e); 
    } 
} 
+0

URL url = getClass()。getClassLoader()。getResource( "/ test.xsd"); url nullを返します。 – user1766169

+0

ええ、あなたは正しいです。私の最後のプロジェクトでは必要でしたが、私はこの振る舞いを再現することはできません。私はその部分を編集し、サンプルコードを追加して問題を解決する一時ファイルにリソースをコピーしました。あなたがそれを完了した後、一時ファイルを削除することを忘れないでください! – tucuxi

関連する問題