我里面有一个jar文件,有一个lib文件夹,其中包含我们在pom文件中提到的所有jar文件。
这里的问题是:如何读取所有外部jar(pom文件jar)文件资源。 示例:example.jar在lib文件夹 file1.jar 和 file2.jar 中具有依赖关系,我想读取file1.jar和file2.jar
的资源JVM如何加载所有资源?
答案 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