Можно ли получить каталог пакета класса в.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 без временных каталогов.

Другие вопросы по тегам