如何将外部 jar 导入 运行 RCP 应用程序的 class 路径
How to import a external jar into the class-path of a running RCP application
我在客户端计算机上有一个 运行 的 Eclipse RCP 应用程序。我需要 RCP 应用程序能够将一些第三方 jar(如数据库连接器 Jar)导入其 class-路径,然后使用 class-路径中的 jar 重新启动。
我试图到处寻找,但我找不到它的教程。我尝试使用以下代码加载 jar:
urls = new URL[] { new URL("jar", "",
"file:" + "C:\Users\Jars\mysql-connector-java-5.1.38.jar" + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls, this.getClass().getClassLoader());
Class<?> loadedClass = cl.loadClass("com.mysql.jdbc.Driver");
但这会加载一个 class。即使我尝试在 jar 中加载所有 classes,我也无法解决内部依赖关系,因为 jar 并不真正位于 RCP 应用程序的 class 路径中。
正常的做法是在Manifest.mf文件中添加Jar的路径,然后用jar打包工具:
Bundle-ClassPath: Jars/mysql-connector-java-5.1.38.jar
但是我无法用工具打包jar
大部分文章都说把jar打包成插件,提供依赖。但是我可以在客户端计算机上执行此操作吗?客户端只向我提供 jar 的路径?
我还阅读了 OSGI 框架 OSGI Tutorial by Vogel。但是我觉得很难理解,我觉得不符合我的要求。
有一些 RCP 应用程序,例如 SQLDeveloper,它们能够在 class-路径中导入各种 JDBC jar,然后使用 class-路径中的 jar 重新启动。所以我认为这是可能的。
谁能帮我解决这个问题。或者将我重定向到 link?提前致谢
请查找以下 code.You 可以在您的 RCP application.This 代码中扩展此代码读取特定文件夹位置中的所有 jar 文件。
特别针对独立应用程序
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MainClass {
public static void main(String[] args) {
File jarFile = new File("Jar file location");
for (File file : jarFile.listFiles()) {
loadLibrary(file);
}
loadLibrary(jarFile);
connectToDataBase();
}
private static void connectToDataBase() {
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive://172.22.75.***:10000/DBNamE", "****",
"***");
Statement preparedStatement = con.createStatement();
preparedStatement.executeQuery("use rapid");
ResultSet resultSet = preparedStatement.executeQuery("select count (*) from flight");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static synchronized void loadLibrary(java.io.File jar) {
try {
java.net.URLClassLoader loader = (java.net.URLClassLoader) ClassLoader.getSystemClassLoader();
java.net.URL url = jar.toURI().toURL();
for (java.net.URL it : java.util.Arrays.asList(loader.getURLs())) {
if (it.equals(url)) {
return;
}
}
java.lang.reflect.Method method = java.net.URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] { java.net.URL.class });
method.setAccessible(
true); /* promote the method to public access */
method.invoke(loader, new Object[] { url });
} catch (final java.lang.NoSuchMethodException | java.lang.IllegalAccessException
| java.net.MalformedURLException | java.lang.reflect.InvocationTargetException e) {
e.printStackTrace();
}
}
}
专门针对基于 RCP 的应用程序
加载 jar Class
public static synchronized void loadAllJars() {
String path = System.getProperty("user.dir");
System.out.println(path + "//jars" + " : Jar Path");
System.out.println(System.getProperty("java.library.path") + " : Home path");
File jarFile = new File(path + "//jars");
for (File file : jarFile.listFiles()) {
System.out.println("Loding jar : " + file.getName());
try {
URLClassLoader loader = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL url = file.toURI().toURL();
for (URL it : Arrays.asList(loader.getURLs())) {
if (it.equals(url)) {
return;
}
}
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(loader, new Object[] { url });
} catch (final java.lang.NoSuchMethodException | java.lang.IllegalAccessException
| java.net.MalformedURLException | java.lang.reflect.InvocationTargetException e) {
e.printStackTrace();
}
}
}
连接到 Db
public class ConnectToDataBase {
public static void connectToDataBase() {
Connection con = null;
String url = "jdbc:mysql://localhost:3306/employees";
try {
LoadJarUtil.loadAllJars();
Properties properties = new Properties();
properties.put("user", "****");
properties.put("password", "****");
@SuppressWarnings("unchecked")
Class<Driver> driver = (Class<Driver>) Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver", false,
ClassLoader.getSystemClassLoader());
Connection connection = driver.newInstance().connect("jdbc:hive://172.22.***:10000", properties);
System.out.println("Connected");
} catch (Exception err) {
err.printStackTrace();
}
}
}
我在客户端计算机上有一个 运行 的 Eclipse RCP 应用程序。我需要 RCP 应用程序能够将一些第三方 jar(如数据库连接器 Jar)导入其 class-路径,然后使用 class-路径中的 jar 重新启动。
我试图到处寻找,但我找不到它的教程。我尝试使用以下代码加载 jar:
urls = new URL[] { new URL("jar", "",
"file:" + "C:\Users\Jars\mysql-connector-java-5.1.38.jar" + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls, this.getClass().getClassLoader());
Class<?> loadedClass = cl.loadClass("com.mysql.jdbc.Driver");
但这会加载一个 class。即使我尝试在 jar 中加载所有 classes,我也无法解决内部依赖关系,因为 jar 并不真正位于 RCP 应用程序的 class 路径中。
正常的做法是在Manifest.mf文件中添加Jar的路径,然后用jar打包工具:
Bundle-ClassPath: Jars/mysql-connector-java-5.1.38.jar
但是我无法用工具打包jar
大部分文章都说把jar打包成插件,提供依赖。但是我可以在客户端计算机上执行此操作吗?客户端只向我提供 jar 的路径?
我还阅读了 OSGI 框架 OSGI Tutorial by Vogel。但是我觉得很难理解,我觉得不符合我的要求。
有一些 RCP 应用程序,例如 SQLDeveloper,它们能够在 class-路径中导入各种 JDBC jar,然后使用 class-路径中的 jar 重新启动。所以我认为这是可能的。
谁能帮我解决这个问题。或者将我重定向到 link?提前致谢
请查找以下 code.You 可以在您的 RCP application.This 代码中扩展此代码读取特定文件夹位置中的所有 jar 文件。 特别针对独立应用程序
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MainClass {
public static void main(String[] args) {
File jarFile = new File("Jar file location");
for (File file : jarFile.listFiles()) {
loadLibrary(file);
}
loadLibrary(jarFile);
connectToDataBase();
}
private static void connectToDataBase() {
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive://172.22.75.***:10000/DBNamE", "****",
"***");
Statement preparedStatement = con.createStatement();
preparedStatement.executeQuery("use rapid");
ResultSet resultSet = preparedStatement.executeQuery("select count (*) from flight");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static synchronized void loadLibrary(java.io.File jar) {
try {
java.net.URLClassLoader loader = (java.net.URLClassLoader) ClassLoader.getSystemClassLoader();
java.net.URL url = jar.toURI().toURL();
for (java.net.URL it : java.util.Arrays.asList(loader.getURLs())) {
if (it.equals(url)) {
return;
}
}
java.lang.reflect.Method method = java.net.URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] { java.net.URL.class });
method.setAccessible(
true); /* promote the method to public access */
method.invoke(loader, new Object[] { url });
} catch (final java.lang.NoSuchMethodException | java.lang.IllegalAccessException
| java.net.MalformedURLException | java.lang.reflect.InvocationTargetException e) {
e.printStackTrace();
}
}
}
专门针对基于 RCP 的应用程序 加载 jar Class
public static synchronized void loadAllJars() {
String path = System.getProperty("user.dir");
System.out.println(path + "//jars" + " : Jar Path");
System.out.println(System.getProperty("java.library.path") + " : Home path");
File jarFile = new File(path + "//jars");
for (File file : jarFile.listFiles()) {
System.out.println("Loding jar : " + file.getName());
try {
URLClassLoader loader = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL url = file.toURI().toURL();
for (URL it : Arrays.asList(loader.getURLs())) {
if (it.equals(url)) {
return;
}
}
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(loader, new Object[] { url });
} catch (final java.lang.NoSuchMethodException | java.lang.IllegalAccessException
| java.net.MalformedURLException | java.lang.reflect.InvocationTargetException e) {
e.printStackTrace();
}
}
}
连接到 Db
public class ConnectToDataBase {
public static void connectToDataBase() {
Connection con = null;
String url = "jdbc:mysql://localhost:3306/employees";
try {
LoadJarUtil.loadAllJars();
Properties properties = new Properties();
properties.put("user", "****");
properties.put("password", "****");
@SuppressWarnings("unchecked")
Class<Driver> driver = (Class<Driver>) Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver", false,
ClassLoader.getSystemClassLoader());
Connection connection = driver.newInstance().connect("jdbc:hive://172.22.***:10000", properties);
System.out.println("Connected");
} catch (Exception err) {
err.printStackTrace();
}
}
}