如何从嵌套jar文件资源中加载资源

时间:2019-09-24 03:58:44

标签: java jvm classloader

我里面有一个jar文件,有一个lib文件夹,其中包含我们在pom文件中提到的所有jar文件。

这里的问题是:如何读取所有外部jar(pom文件jar)文件资源。 示例:example.jar在lib文件夹 file1.jar file2.jar 中具有依赖关系,我想读取file1.jar和file2.jar

的资源

JVM如何加载所有资源?

2 个答案:

答案 0 :(得分:0)

这是一种非常不寻常的情况,也许通常使用的更好的方法是“填充”罐子,因此在“外部”罐子的某个文件夹中不会有依赖罐子,而是依赖罐子中的所有软件包将会变成位于您自己的代码(可能仍然位于外部jar中)旁边的外部jar的程序包。

Maven为此提供了shade plugin,这通常是可行的方法。

一个值得注意的例外是将Spring Boot应用程序打包为JAR,它们就像您所说的那样工作(它们将相关的jar放入BOOT-INF/lib库中,因此从技术上讲,其jar放在jar中)。 他们有自己的理由来进行这样的工作,这超出了此问题的范围,但是相关的一点是,他们必须创建一个特殊的类加载器来处理这种情况。开箱即用的Java可以从文件系统或常规jar中读取类,但是从理论上讲,只要您实现可以找到的类加载器,Java应用程序就可以从任何地方读取二进制代码(远程文件系统,数据库,Jar内的Jar等)。并从那里加载资源。

通常,除非您真的知道自己在做什么,否则我建议不要将类加载器弄混。大多数Java程序员并没有真正创建自己的类加载器。

答案 1 :(得分:-2)

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
相关问题