2017-09-24 9 views
0

は私の.jar内Fileとしてクラスパッケージのディレクトリを取得しようとしています(階層は/controller/coreです):私はそれを実行したとき、私はIDE内のプログラムを実行されますが、ときに動作.jar内のクラスパッケージのディレクトリを取得することは可能ですか?

File directory_file_of_package = new File(getClass().getResource("/controller/core").toURI()); 

スタンドアロンの.jarとして、それは私に、このエラーを与える:これらの質問は、リソース(getResourceAsStream())としての.jar内Fileを取得関与するので

java.lang.IllegalArgumentException: URI is not hierarchical 

これらの質問(why my URI is not hierarchical?Java Jar file: use resource errors: URI is not hierarchical)を見ると、私を助けていませんしかし、私が得ようとしているのはディレクトリです。

さらに、受け入れ答え状態この:

Generally the IDEs separates on file system classes and resources. But when the jar is created they are put all together.

ので、/controller/coreのディレクトリをつかむための方法はありませんか?

マイXY問題:私はCSVJDBC(http://csvjdbc.sourceforge.net/)を使用して.CSVファイルを読み込むしようとしています

、および方法DriverManager参照CSVファイル含むフォルダある場合に限りデータベースCSVファイルテーブルです。

public class SearchData { 

    void SearchData() { 
     try { 
      Class.forName("org.relique.jdbc.csv.CsvDriver"); 

      File directory_file_of_package_containing_csv = new File(getClass().getResource("/controller/core").toURI()); 

      // Driver points to directory which contains the CSV file as if it is the database 
      Connection conn = DriverManager.getConnection("jdbc:relique:csv:" + directory_file_of_package_containing_csv.toString()); 
      System.out.println("Connection established."); 
      Statement stmt = conn.createStatement(); 
      System.out.println("Statement created."); 

      // CSV is named "data.csv" so the CsvDriver sees "data" as the table name 
      String sql = "SELECT id,name FROM data"; 

      ResultSet results = stmt.executeQuery(sql); 

      ... 

     } catch (ClassNotFoundException | SQLException | URISyntaxException e) { 
      e.printStackTrace();    
     } 
    } 
} 

.jarに含まれるcsvファイルにCsvJdbcを指定するにはどうすればよいですか?

答えて

1

JAR内にパッケージのディレクトリは存在しません。クラスがまだJARファイルにパッケージ化されておらず、いくつかのディレクトリにあるため、IDEで動作します。しかし、JARではそうではありません。

あなたが使用しているライブラリの中にファイルが入ったディレクトリが必要な場合は、一般にクラスパスリソースでこれを達成することはできません。オプションの1つは、リソースのコピーを一時ディレクトリにファイルとして作成することです。

別の方法としては、勉強したいことがありCsvJDBC documentation近い:

To read data that is either held inside the Java application (for example, in a JAR file) or accessed remotely (for example, using HTTP requests), create a Java class that implements the interface org.relique.io.TableReader and give this class name in the connection URL. CsvJdbc then creates an instance of this class and calls the getReader method to obtain a java.io.Reader for each database table being read.

ですから、一時ディレクトリなしCsvJDBCのためにこれを解決することができます。

関連する問題