java程序关于第三方jar包发布的另一种方法(从老金的博客中拷来的)

java程序关于第三方jar包发布的另一种方法

    大概我们每个人都有过这种经历,编好了一个应用,当打成jar包后,当引用第三包时却总是抛ClassNotFoundException 而无法正常运行。我现在知道的有两种解决方法,一种是在manifest.mf中设置classpath,把所需的第三方包手动加进去,还有一种就是用是用第三方打包工具了,比如fatjar。今天察看Jmeter的源代码时发现了另一种方法。为了更清楚些,下面进行举例进行说明:
      先新建一个工程,建一个类,源代码如下:
     package first;
    import java.util.Date;
    public class My {
       public String getTime(){
            return new Date().toString();
      }
   }
    然后把它打成包,用来模拟第三方包,不妨取名first.jar.
   然后,再建第二个工程,把刚才的包加入到这个工程中,新建类如下:
  package mypackage;
  import first.My;
  public class Task {
    public void start(String [] args){
        My my = new My();
        System.out.println(my.getTime());
    }
 }
  start()方法作为咱们整个应用的入口函数,经测试发现没有问题。到此,准备工作完毕,下面开始进行解决问题的关键部分了:
  新建类NewDrever,其源代码如下:
                                   package mypackage;
                                   import java.io.File;
                                    import java.io.FilenameFilter;
                                    import java.lang.reflect.Method;
                                    import java.net.MalformedURLException;
                                    import java.net.URL;
                                    import java.net.URLClassLoader;
                                    import java.util.LinkedList;
                                    import java.util.List;
                                    public class NewDrever {
                                                public static void main(String [] args){
                                                                File userDir = new File(System.getProperty("user.dir"));
                                                                String jmDir = userDir.getAbsoluteFile().getParent();
                                                                File libDirs = new File(jmDir+File.separator+"lib");
                                                                File [] libJars = libDirs.listFiles(new FilenameFilter(){
                                                                public boolean accept(File dir,String name) {
                                                                                        if(name.endsWith(".jar"))
                                                                                                return true;
                                                                                            return false;
                                                                }
                                                                    });
                                                            List jars = new LinkedList();
                                                            //System.out.println(System.getProperty("java.class.path"));
                                                            StringBuffer classpath = new StringBuffer();
                                                            for(int i = 0;i < libJars.length;i++){
                                                            try {
                                                                                jars.add(new URL("file","",libJars[i].getPath()));
                                                                                classpath.append(System.getProperty("path.separator"));
                                                                                classpath.append(libJars[i].getPath());
                                                                } catch (MalformedURLException e) {
                                                                                        e.printStackTrace();
                                                                                            }
                                                    }
                                                    System.setProperty("java.class.path",System.getProperty("java.class.path")+classpath.toString());
                                                    //System.out.println(System.getProperty("java.class.path"));
                                                    URLClassLoader loader = new URLClassLoader((URL[])jars.toArray(new URL[0]));
                                                    //Thread.currentThread().setContextClassLoader(loader);
                                                    try {
                                                                Class JMeter = loader.loadClass("mypackage.Task");
                                                                Object instance = JMeter.newInstance();
                                                                Method startup = JMeter.getMethod("start",new Class[]{(new String[0]).getClass()});
                                                                startup.invoke(instance,new Object[]{args});
                                                        } catch(Exception e) {
                                                                    e.printStackTrace();
                                                        }
                                }
                    }
    把第二个工程打成可执行的jar包,取名second.jar,新建一个文件夹,不妨取名为Test,test下面分别建lib和bin两个文件夹,把first.jar和second.jar拷贝到lib中,把second.jar再考到bin下面一份。现在还没有完毕,把bin下的second.jar的包中除了
NewDrever.class全部删掉,至此完毕。这时,进到bin目录下 敲java -jar second.jar 会在控制台打出当前的时间。而时间来自"第三方包"。

posted on 2007-07-10 10:50 liujg 阅读(786) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

boddiy

搜索

最新评论

阅读排行榜

评论排行榜