2016-12-13 5 views
1

클라이언트 컴퓨터에서 실행되는 Eclipse RCP 응용 프로그램이 있습니다. 제 3 자 jar (Database connector Jars와 같은)를 클래스 경로로 가져온 다음 클래스 경로의 jar로 다시 시작할 수있게하려면 RCP 응용 프로그램이 필요합니다.실행중인 RCP 응용 프로그램의 클래스 경로에 외부 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"); 

그러나이 클래스는 단일 클래스를로드합니다. 항아리에있는 모든 클래스를로드하려고해도 항아리가 진정으로 RCP 응용 프로그램의 클래스 경로에 있지 않으므로 내부 종속성을 확인할 수 없습니다.

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

하지만 난 도구로 항아리를 포장 할 수 없습니다

을 수행하는 일반적인 방법은 MANIFEST.MF 파일에있는 항아리의 경로를 추가하고 용기와 도구를 포장하는 것입니다.

대부분의 기사는 항아리를 플러그인으로 패키지하고 종속성을 제공한다고 말합니다. 그러나 클라이언트가 단지 jar에 대한 경로를 제공하는 클라이언트 시스템에서이 작업을 수행 할 수 있습니까?

나는 OSGI 프레임 워크 OSGI Tutorial by Vogel에 대해서도 읽었습니다. 그러나 나는 이해하기가 어려워서 내 요구 사항을 충족시키지 못한다고 생각합니다.

SQLDeveloper와 같은 몇 가지 RCP 응용 프로그램은 클래스 경로에 다양한 JDBC jar를 가져온 다음 클래스 경로의 JAR로 다시 시작할 수 있습니다. 그래서 나는 그것이 가능하다고 생각한다.

아무도 도와 드릴 수 있습니까? 또는 링크를 다시 redirrect합니까? 미리 감사드립니다

답변

1

다음 코드를 찾으십시오.이 코드는 RCP 응용 프로그램에서 확장 할 수 있습니다.이 코드는 특정 폴더 위치의 모든 jar 파일을 읽습니다. RCP 기반 응용 프로그램 특히 로드 항아리 클래스

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

를 들어 독립 실행 형 응용 프로그램 특히

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

} 
} 

를 들어 연결 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(); 
     } 
    } 

} 
+0

에이 완벽하게 작동합니다. 그러나 서로 상호 의존적 인 여러 항아리가 있다면 어떨까요? 이 병을 올바른 순서로 가져올 수 있습니까? –

+1

예. 작동합니다. 여러 개의 항아리로 테스트했습니다. –