如何将外部jar导入到正在运行的RCP应用程序的类路径中

时间:2016-12-13 05:36:37

标签: java eclipse eclipse-rcp rcp

我有一个在客户端计算机上运行的Eclipse RCP应用程序。我需要RCP应用程序能够将一些第三方jar(如数据库连接器Jars)导入其类路径,然后使用类路径中的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");

但这会加载一个类。即使我尝试加载jar中的所有类,我也无法解析内部依赖关系,因为jar不是真正在RCP应用程序的类路径中。

通常的方法是在Manifest.mf文件中添加Jar的路径并使用jar打包工具:

Bundle-ClassPath: Jars/mysql-connector-java-5.1.38.jar

但是我无法使用该工具打包jar。

大多数文章都说要将jar打包到插件中并提供依赖。但我可以在客户端机器上执行此操作,客户端只为我提供了jar的路径吗?

我还阅读了有关OSGI框架OSGI Tutorial by Vogel的内容。但我觉得很难理解,我认为它不符合我的要求。

Ther是一些RCP应用程序,如SQLDeveloper,它们具有在类路径中导入各种JDBC jar的能力,然后在类路径中使用jar重新启动。所以我认为这是可能的。

任何人都可以帮助我。或者将我重新指向一个链接?提前致谢

1 个答案:

答案 0 :(得分:1)

请查找以下代码。您可以在RCP应用程序中扩展它。此代码读取特定文件夹位置中的所有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类

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();
        }
    }

}