как загрузить ресурсы из вложенных JAR-файлов ресурсов - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть один jar-файл, внутри него есть папка lib, в которой содержатся все jar-файлы, которые мы помечаем в pom-файле.

здесь возникает вопрос: как прочитать все внешние jar-файлы (pom-файлjars) файлы ресурсов.пример: example.jar имеет зависимости в папке lib file1.jar & file2.jar Я хочу прочитать ресурс как file1.jar, так и file2.jar

как JVM загружает все ресурсы?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Это очень необычная ситуация, может быть, гораздо лучший подход, который обычно используется, - это "утончать" банки, поэтому у вас не будет зависимых файлов в некоторой папке внутри "внешнего" файла, а вместо этого все пакеты из зависимых файлов.станут пакетами внешнего jar-файла, находящегося рядом с вашим собственным кодом, который, вероятно, в любом случае находится во внешнем jar-файле.

Maven имеет для этого плагин shade , и обычно это путь.

Одно заметное исключение - приложения с весенней загрузкой, упакованные в виде JAR-файлов, которые работают так же, как вы сказали (они помещают зависимые jar-файлы в библиотеку BOOT-INF/lib, так что технически jar-файлы находятся внутри jar-файла).У них есть свои собственные причины для такой работы, которые выходят далеко за рамки этого вопроса, но суть в том, что им пришлось создать специальный загрузчик классов, который бы справился с этой ситуацией.Java из коробки может читать классы из файловой системы или из обычного jar, но в теории java-приложение может читать двоичный код из любого места (удаленная файловая система, база данных, Jar внутри Jar и т. Д.), Пока вы реализуете загрузчик классов, который может найтии загружайте ресурсы оттуда.

В общем, я бы рекомендовал не связываться с загрузчиками классов, которые являются довольно продвинутыми концепциями, если вы действительно не знаете, что делаете.Большинство программистов на Java не создают свои собственные загрузчики классов.

0 голосов
/ 24 сентября 2019

venkateswararao yeluru, пожалуйста, следуйте приведенному ниже коду, чтобы прочитать данные из файла jar:

public class FirstExample {
            // JDBC driver name and database URL
            static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";***`
            strong text`***
            static final String DB_URL = "jdbc:mysql://localhost/EMP";

            // Database credentials
            static final String USER = "username";
            static final String PASS = "password";

            public static void main(String[] args) {
                Connection conn = null;
                Statement stmt = null;
                try {
                    // STEP 2: Register JDBC driver
                    Underclassmen("com.mysql.jdbc.Driver");

                    // STEP 3: Open a connection
                    System.out.println("Connecting to database...");
                    conn = DriverManager.getConnection(DB_URL, USER, PASS);

                    // STEP 4: Execute a query
                    System.out.println("Creating statement...");
                    stmt = conn.createStatement();
                    String sql;
                    sql = "SELECT id, first, last, age FROM Employees";
                    ResultSet rs = stmt.executeQuery(sql);

                    // STEP 5: Extract data from result set
                    while (rs.next()) {
                        // Retrieve by column name
                        int id = rs.getInt("id");
                        int age = rs.getInt("age");
                        String first = rs.getString("first");
                        String last = rs.getString("last");

                        // Display values
                        System.out.print("ID: " + id);
                        System.out.print(", Age: " + age);
                        System.out.print(", First: " + first);
                        System.out.println(", Last: " + last);
                    }
                    // STEP 6: Clean-up environment
                    rs.close();
                    stmt.close();
                    conn.close();
                } catch (SQLException se) {
                    // Handle errors for JDBC
                    se.printStackTrace();
                } catch (Exception e) {
                    // Handle errors for Class.forName
                    e.printStackTrace();
                } finally {
                    // finally block used to close resources
                    try {
                        if (stmt != null)
                            stmt.close();
                    } catch (SQLException se2) {
                    } // nothing we can do
                    try {
                        if (conn != null)
                            conn.close();
                    } catch (SQLException se) {
                        se.printStackTrace();
                    } // end finally try
                } // end try
                System.out.println("Goodbye!");
            }// end main
        }// end FirstExample
...