Можно ли получить каталог пакета класса в.jar?
Я пытаюсь получить каталог пакета класса как File
в моем.jar (иерархия /controller/core
):
File directory_file_of_package = new File(getClass().getResource("/controller/core").toURI());
Это работает, когда я запускаю программу в среде IDE, но когда я запускаю ее как отдельный.jar, она выдает мне эту ошибку:
java.lang.IllegalArgumentException: URI is not hierarchical
Глядя на эти вопросы ( почему мой URI не является иерархическим? И файл Jar Java: использовать ошибки ресурса: URI не является иерархическим) мне не поможет, потому что эти вопросы связаны с получением File
внутри.jar как ресурс (getResourceAsStream()
), но я пытаюсь получить каталог.
Далее принятый ответ гласит:
Обычно среды IDE разделяются на классы и ресурсы файловой системы. Но когда баночка создана, они складываются вместе.
Итак, нет ли способа получить каталог /controller/core
?
Моя проблема XY:
Я пытаюсь прочитать файл.CSV, используя CSVJDBC ( http://csvjdbc.sourceforge.net/), и способ 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();
}
}
}
Как я могу указать CsvJdbc на мой CSV-файл, содержащийся в.jar?
1 ответ
В JAR просто нет каталога пакета. Он работает в IDE, потому что ваш класс еще не упакован в файл JAR и находится в некотором каталоге. Но это не относится к банкам.
Поэтому, если для некоторых из используемых вами библиотек требуется каталог с файлом, вы обычно не можете добиться этого с помощью ресурсов classpath. Одним из вариантов будет создание копии вашего ресурса в виде файла во временном каталоге.
В качестве альтернативы вы можете изучить документацию CsvJDBC ближе:
Чтобы прочитать данные, которые хранятся внутри приложения Java (например, в файле JAR) или доступны удаленно (например, с помощью HTTP-запросов), создайте класс Java, который реализует интерфейс
org.relique.io.TableReader
и укажите имя этого класса в URL-адресе соединения. CsvJdbc затем создает экземпляр этого класса и вызываетgetReader
метод полученияjava.io.Reader
для каждой таблицы базы данных, которая читается.
Таким образом, вы должны быть в состоянии решить эту проблему для CsvJDBC без временных каталогов.