动态加载jar

上传一个jar包并动态加载包里面的class,留个样例,以后好找

 1 package com.yihaodian.backend.tt.util;

 2 

 3 import java.io.File;

 4 import java.io.FileInputStream;

 5 import java.io.FileNotFoundException;

 6 import java.io.FileOutputStream;

 7 import java.io.IOException;

 8 import java.net.URL;

 9 import java.net.URLClassLoader;

10 

11 import org.apache.struts2.ServletActionContext;

12 

13 public class JarUtil {

14 

15     private final static String PATH = ServletActionContext.getServletContext().getRealPath("/")+"uploadJar"+File.separator;

16     

17     private static void uploadJar(File jar,String filePathName) {

18         try {

19             FileInputStream fin = new FileInputStream(jar);//获得上传的jar文件

20             File dir = new File(PATH);

21             if(!dir.exists()){

22                 dir.mkdir();

23             }

24             FileOutputStream fout = new FileOutputStream(new File(filePathName));//输出jar到指定位置

25             byte[] buffer = new byte[1024];

26             int count = fin.read(buffer);

27             while (count > 0) {

28                 fout.write(buffer,0,count);//这里一定要标注0,count,否则jar实际上是有问题的。导致后面的jar无法加载

29                 count = fin.read(buffer);

30             }

31              fout.flush();

32              fout.close();

33              fin.close();

34         } catch (FileNotFoundException e) {

35             e.printStackTrace();

36         } catch (IOException e) {

37             e.printStackTrace();

38         }

39     }

40     

41     private static void loadClassOfJar(URL url, String cls) {  

42         try {  

43             URLClassLoader loader = new URLClassLoader(new URL[] {url},Thread.currentThread().getContextClassLoader());  

44 //            Thread.currentThread().setContextClassLoader(loader);//这里必须要设置当前线程的classLoader为新的classLoader

45             Class<?> clazz = loader.loadClass(cls); //动态装载class

46             

47 //            Class clazz0 = Class.forName("com.yihaodian.backend.log.service.MerchantLogQueryService");

48 //            System.out.println(clazz0);

49             Class clazz1 = Class.forName("com.yihaodian.backend.log.service.MerchantLogQueryService",true,loader);

50             System.out.println(clazz1);

51             

52         } catch (Exception ex) {  

53             ex.printStackTrace();  

54         }  

55     } 

56     

57     

58     

59     public static void loadJar(File jar,String jarFileName,String className){

60         

61         String filePathName = PATH + jarFileName.substring(0,jarFileName.indexOf(".jar"))+"-"+

62         System.currentTimeMillis()+jarFileName.substring(jarFileName.indexOf(".jar"));    //得到服务器上要放置的文件路径,给jar添加一个加入时刻防止名称重复

63         

64         System.setProperty("java.class.path",System.getProperty("java.class.path")+";"+filePathName);

65         uploadJar(jar,filePathName);//上传jar

66         

67         File file = new File(filePathName);//加载这个刚上传的jar文件

68         try {

69             loadClassOfJar(file.toURI().toURL(), className);//动态加载jar中的接口

70             

71         } catch (Exception e) {

72             e.printStackTrace();

73         }

74     }

75     

76 }

你可能感兴趣的:(jar)