java执行jar中的class类

很多情况都会需要运行jar,网上资料很多,大致分为三种方法:

一、直接达成可执行的jar。

二、定义lib path,使用命令执行。

三、定时classloader,手动加载jar。

第一种方案比较简单,就不做介绍。

第二种方案比较适用于jar都集中在一个目录下,命令如下:

java -Djava.ext.dirs="../3rdLib"  -cp . com.aspire.bdc.component.codegenerate.main.StartGenerate 

使用的是 -Djava.ext.dirs参数来加载jar。

第三种方案,比较灵活,可以加载不同目录下的jar,代码如下:

首先定义一个ClassLoaderUtil

package com.whty.onest;

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

public final class ClassLoaderUtil
{
  private static Method addURL = initAddMethod();

  private static URLClassLoader system = (URLClassLoader)ClassLoader.getSystemClassLoader();

  private static final Method initAddMethod()
  {
    try
    {
      Method add = URLClassLoader.class
        .getDeclaredMethod("addURL", new Class[] { URL.class });
      add.setAccessible(true);
      return add;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  private static final void loopFiles(File file, List<File> files)
  {
    if (file.isDirectory()) {
      File[] tmps = file.listFiles();
      for (File tmp : tmps) {
        loopFiles(tmp, files);
      }
    }
    else if ((file.getAbsolutePath().endsWith(".jar")) || (file.getAbsolutePath().endsWith(".zip"))) {
      files.add(file);
    }
  }

  public static final void loadJarFile(File file)
  {
    try
    {
      addURL.invoke(system, new Object[] { file.toURI().toURL() });
      System.out.println("加载JAR包:" + file.getAbsolutePath());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static final void loadJarPath(String path)
  {
    List files = new ArrayList();
    File lib = new File(path);
    loopFiles(lib, files);
    for (File file : files)
      loadJarFile(file);
  }
}

 然后新建一个测试类ServerStart:在main方法中执行libpath

public class ServerStart
{
  public static void main(String[] args)
  {
    try
    {
      ClassLoaderUtil.loadJarPath(System.getProperty("user.dir") + "/lib");

      System.out.println(FeiZoPanClient.uploadFile("/home/edu2/page.txt"));
      System.out.println(FeiZoPanClient.uploadFile("/home/edu2/resource.war"));
      System.out.println(FeiZoPanClient.uploadFile("/home/edu2/resource.txt"));
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

 最后执行使用java命令执行java ServerStart

猜你喜欢

转载自lipengjavablog.iteye.com/blog/2252040