java使用java -jar执行jar文件

现在比较流行使用java -jar xx.jar命令来执行可执行的jar包,在这里记录一下java -jar 运行jar包的常用方法。

jar里面包含所有依赖包的

一般直接使用java -jar来执行命令就行了,我们会设置内存等常规参数,这种情况适合jar里面包含所有的依赖的情况。

nohup java -Dfile.encoding="utf8"  -Xms1024m -Xmx1024m K  -jar $prjName.jar &
jar包里面包含MANIFEST.MF文件,并且制定了Main-Class属性指定了启动类。
Manifest-Version: 1.0
Class-Path: 
Created-By: 1.4.2 (Sun Microsystems Inc.)
Class-Path: lib/xx.jar  lib/xxa.jar lib/xxb.jar  所有依赖的jar包都在这里配置,这个实现的原理就行使用AppClassloader来实现加载的。
Main-Class: com.imobpay.base.start.Start

需要加载额外jar的情况

有时候我们运行的jar包还需要依赖外部的jar包,也就是没有把依赖包放到执行的jar包里面的时候,就需要指定加载额外的jar包了。

使用Bootstrap Classloader来加载这些类

这个没测试,拷贝的别人的。

-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.
win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar
unix    java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar
win32系统每个jar用分号隔开,unix系统下用冒号隔开

使用Extension Classloader来加载

java中系统属性java.ext.dirs指定的目录由ExtClassLoader加载器加载
如果您的程序没有指定该系统属性(-Djava.ext.dirs=sss/lib), 那么该加载器默认加载$JAVA_HOME/lib/ext目录下的所有jar文件
但如果你手动指定系统属性且忘了把$JAVA_HOME/lib/ext路径给加上, 那么ExtClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件, 这意味着你将失去一些功能, 例如java自带的加解密算法实现,所以最好的同时指定两个目录。

执行代码
这是在Linux上执行的,我把要执行的jar包放在lib的同级目录下,使用-Djava.ext.dirs可以同时指定多个目录,使用:分开。

[paydubbo@qtbj-dmz-102 lib]$ java -Djava.ext.dirs=/home/paydubbo/jdk1.8.0_162/jre/lib/ext/:lib/ -jar xxx.jar 

使用java -cp来执行

这个就是把所有的jar包放在同一个目录,然后使用-cp进行指定,后面接需要执行的类的全路径。(cp是classpath的缩写???)

java -cp  lib/*   com.imobpay.base.Start

使用自定义的Classloader进行加载

这个实现的方式比较多,照搬我们现在的模式。
下面是测试类,把这个类打成一个jar包,执行运行会包Gson找不到了。我传入加载包的的路劲之后就可以运行了,
执行命令
这里我通过jar包后面传参数的形式指定需要加载的jar文件路劲,依赖包和要运行的jar包必须放在同一个目录下面(这是因为我使用了jar包相对路劲)。

  java -jar .\xx.jar C:\Users\Administrator\Desktop\lib

链接:https://pan.baidu.com/s/1bgP2VUIfFEx1I833PCO9dg
提取码:l2lu

package com.madman.base;

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Base64;
import java.util.Base64.Decoder;

import com.google.gson.Gson;

import sun.misc.Launcher;

/**
 * 类加载器分为:引导加载器-扩展加载器-系统加载器-用户自定义加载器 一般情况下:加载器的原则是:先交于上层加载器加载,如果加载失败,在由自己加载。
 * 因为官方对于类加载器进行了:双亲委派模式进行修饰, 可以保证类加载,尽量不会出现不同加载器加载同一个类的情况出现 具体情况请查询类加载器的描述 <br/>
 * 
 * @ClassName: ClassLoaderUtil<br/>
 * @Description: 类加载器的工具类,(主要用于把class类加载到jvm中)<br/>
 * @version 1.0<br/>
 * @since JDK 1.6<br/>
 * @since PlatForm 1.0<br/>
 * 
 *        Copyright: Copyright (c) 2014 Company:www.imobpay.com<br/>
 */
@SuppressWarnings("restriction")
public class ClassLoaderUtil {

	/** 参数 */
	private static Method addURL;
	/**
	 * 静态块 <br/>
	 * 
	 * @Title: getSystemClassLoader<br/>
	 * @Description: 静态块,用来得到URLClassLoader加载类中的addURL方法<br/>
	 * @Date May 4, 2014 29:19:03 AM<br/>
	 * @modifyDate May 4, 2014 29:19:03 AM<br/>
	 */
	static {
		try {
			addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
		} catch (Exception e) {
			e.printStackTrace();
		}
		addURL.setAccessible(true);
	}

	/** 系统参数 */
	private static URLClassLoader system = (URLClassLoader) getSystemClassLoader();
	/** 系统参数 */
	private static URLClassLoader ext = (URLClassLoader) getExtClassLoader();

	/**
	 * 获取系统的类加载器<br/>
	 * 
	 * @Title: getSystemClassLoader<br/>
	 * @Description: 获取系统的类加载器<br/>
	 * @Date May 4, 2014 29:19:03 AM<br/>
	 * @modifyDate May 4, 2014 29:19:03 AM<br/>
	 * @return ClassLoader 类加载器对象 java.lang.ClassLoader<br/>
	 */
	public static ClassLoader getSystemClassLoader() {
		return ClassLoader.getSystemClassLoader();
	}

	/**
	 * 获取jdk中ext目录中的加载器,扩展类加载器<br/>
	 *
	 * @Title: getExtClassLoader<br/>
	 * @Description: 获取jdk中ext目录中的加载器,扩展类加载器<br/>
	 * @Date May 4, 2014 29:21:38 AM<br/>
	 * @modifyDate May 4, 2014 29:21:38 AM<br/>
	 * @return ClassLoader 类加载器对象 java.lang.ClassLoader<br/>
	 */
	public static ClassLoader getExtClassLoader() {
		return getSystemClassLoader().getParent();
	}

	/**
	 * 获取引导加载器加载的URL数组 , 因为引导加载需要加载环境变量中配置的ClassPath中的jar,所有由配置决定加载了几个路径下的东西 <br/>
	 * 
	 * @Title: getBootstrapURLs<br/>
	 * @Description: 获取引导加载器加载的URL数组<br/>
	 * @Date May 4, 2014 29:40:28 AM<br/>
	 * @modifyDate May 4, 2014 29:40:28 AM<br/>
	 * @return URL[] URL数组 java.net.URL[]<br/>
	 */
	@SuppressWarnings("all")
	public static URL[] getBootstrapURLs() {
		return Launcher.getBootstrapClassPath().getURLs();
	}

	/**
	 * 获取系统加载器加载的URL数组 <br/>
	 * 
	 * @Title: getSystemURLs<br/>
	 * @Description: 获取系统加载器加载的URL数组<br/>
	 * @Date May 4, 2014 29:42:33 AM<br/>
	 * @modifyDate May 4, 2014 29:42:33 AM<br/>
	 * @return URL[] URL数组 java.net.URL[]<br/>
	 */
	public static URL[] getSystemURLs() {
		return system.getURLs();
	}

	/**
	 * 获取扩展加载器加载的URL数组<br/>
	 *
	 * @Title: getExtURLs<br/>
	 * @Description: 获取扩展加载器加载的URL数组<br/>
	 * @Date May 4, 2014 29:43:29 AM<br/>
	 * @modifyDate May 4, 2014 29:43:29 AM<br/>
	 * @return URL[] URL数组 java.net.URL[]<br/>
	 */
	public static URL[] getExtURLs() {
		return ext.getURLs();
	}

	/**
	 * 输出URL数组的内容到PrintStream流中 <br/>
	 * 
	 * @Title: list<br/>
	 * @Description: 输出URL数组的内容到PrintStream流中<br/>
	 * @Date May 4, 2014 29:44:48 AM<br/>
	 * @modifyDate May 4, 2014 29:44:48 AM
	 * @param ps        输出的流对象 java.io.PrintStream<br/>
	 * @param classPath URL数组 java.net.URL[]<br/>
	 */
	private static void list(PrintStream ps, URL[] classPath) {
		for (int i = 0; i < classPath.length; i++) {
			ps.println(classPath[i]);
		}
	}

	/**
	 * 将引导加载器中的加载URL数组输出到System.out中
	 *
	 * @Title: listBootstrapClassPath
	 * @Description: 将引导加载器中的加载URL数组打印到System.out中
	 * @Date May 4, 2014 29:46:00 AM
	 * @modifyDate May 4, 2014 29:46:00 AM
	 */
	public static void listBootstrapClassPath() {
		listBootstrapClassPath(System.out);
	}

	/**
	 * 将引导加载器中的加载URL数组输出到PrintStream中
	 *
	 * @Title: listBootstrapClassPath
	 * @Description: 将引导加载器中的加载URL数组输出到PrintStream中
	 * @Date May 4, 2014 29:46:59 AM
	 * @modifyDate May 4, 2014 29:46:59 AM
	 * @param ps 输出流PrintStream java.io.PrintStream
	 */
	public static void listBootstrapClassPath(PrintStream ps) {
		ps.println("BootstrapClassPath:");
		list(ps, getBootstrapClassPath());
	}

	/**
	 * 将系统加载器中的加载URL数组输出到System.out中
	 *
	 * @Title: listSystemClassPath
	 * @Description: 将系统加载器中的加载URL数组输出到System.out中
	 * @Date May 4, 2014 29:48:21 AM
	 * @modifyDate May 4, 2014 29:48:21 AM
	 */
	public static void listSystemClassPath() {
		listSystemClassPath(System.out);
	}

	/**
	 * 将系统加载器中的加载URL数组输出到PrintStream中
	 *
	 * @Title: listSystemClassPath
	 * @Description: 将系统加载器中的加载URL数组输出到PrintStream中
	 * @Date May 4, 2014 29:49:02 AM
	 * @modifyDate May 4, 2014 29:49:02 AM
	 * @param ps 输出流PrintStream java.io.PrintStream
	 */
	public static void listSystemClassPath(PrintStream ps) {
		ps.println("SystemClassPath:");
		list(ps, getSystemClassPath());
	}

	/**
	 * 将扩展加载器中的加载URL数组输出到System.out中
	 *
	 * @Title: listExtClassPath
	 * @Description: 将扩展加载器中的加载URL数组输出到System.out中
	 * @Date May 4, 2014 29:50:01 AM
	 * @modifyDate May 4, 2014 29:50:01 AM
	 */
	public static void listExtClassPath() {
		listExtClassPath(System.out);
	}

	/**
	 * 将扩展加载器中的加载URL数组输出到PrintStream中
	 *
	 * @Title: listSystemClassPath
	 * @Description: 将扩展加载器中的加载URL数组输出到PrintStream中
	 * @Date May 4, 2014 29:50:31 AM
	 * @modifyDate May 4, 2014 29:50:31 AM
	 * @param ps 输出流PrintStream java.io.PrintStream
	 */
	public static void listExtClassPath(PrintStream ps) {
		ps.println("ExtClassPath:");
		list(ps, getExtClassPath());
	}

	/**
	 * 获取引导加载器加载的URL数组; 因为引导加载需要加载环境变量中配置的ClassPath中的jar,所有由配置决定加载了几个路径下的东西
	 *
	 * @Title: getBootstrapClassPath
	 * @Description: 获取引导加载器加载的URL数组
	 * @Date May 4, 2014 29:51:31 AM
	 * @modifyDate May 4, 2014 29:51:31 AM
	 * @return URL[] URL数组 java.net.URL[]
	 */
	public static URL[] getBootstrapClassPath() {
		return getBootstrapURLs();
	}

	/**
	 * 获取系统加载器加载的URL数组
	 *
	 * @Title: getSystemClassPath
	 * @Description: 获取系统加载器加载的URL数组
	 * @Date May 4, 2014 29:52:35 AM
	 * @modifyDate May 4, 2014 29:52:35 AM
	 * @return URL[] URL数组 java.net.URL[]
	 */
	public static URL[] getSystemClassPath() {
		return getSystemURLs();
	}

	/**
	 * 获取扩展加载器加载的URL数组
	 *
	 * @Title: getExtClassPath
	 * @Description: 获取扩展加载器加载的URL数组
	 * @Date May 4, 2014 29:53:09 AM
	 * @modifyDate May 4, 2014 29:53:09 AM
	 * @return URL[] URL数组 java.net.URL[]
	 */
	public static URL[] getExtClassPath() {
		return getExtURLs();
	}

	/**
	 * 添加URL到系统加载器中,URL应该为Jar包的绝对路径,class文件的绝对路径 <br/>
	 * 内部捕捉了异常,并用e.printStackTrace()打印了堆栈
	 *
	 * @Title: addURL2SystemClassLoader
	 * @Description: 添加URL到系统加载器中
	 * @Date May 4, 2014 29:53:30 AM
	 * @modifyDate May 4, 2014 29:53:30 AM
	 * @param url 需要添加的URL java.net.URL
	 */
	public static void addURL2SystemClassLoader(URL url) {
		try {
			addURL.invoke(system, new Object[] { url });
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加URL到扩展加载器中,URL应该为Jar包的绝对路径,class文件的绝对路径 <br/>
	 * (内部捕捉了异常,并用e.printStackTrace()打印了堆栈)
	 *
	 * @Title: addURL2ExtClassLoader
	 * @Description: 添加URL到扩展加载器中
	 * @Date May 4, 2014 29:55:06 AM
	 * @modifyDate May 4, 2014 29:55:06 AM
	 * @param url 需要添加的URL java.net.URL
	 */
	public static void addURL2ExtClassLoader(URL url) {
		try {
			addURL.invoke(ext, new Object[] { url });
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加String路径到系统加载器中,String路径应该为Jar包的绝对路径,class文件的绝对路径
	 * 
	 * @Title: addClassPath
	 * @Description: 添加String路径到系统加载器中
	 * @Date May 4, 2014 29:55:58 AM
	 * @modifyDate May 4, 2014 29:55:58 AM
	 * @param path String路径 java.lang.String
	 */
	public static void addClassPath(String path) {
		addClassPath(new File(path));
	}

	/**
	 * 添加String路径到扩展加载器中,String路径应该为Jar包的绝对路径,class文件的绝对路径
	 * 
	 * @Title: addExtClassPath
	 * @Description: 添加String路径到扩展加载器中
	 * @Date May 4, 2014 29:57:52 AM
	 * @modifyDate May 4, 2014 29:57:52 AM
	 * @param path String路径 java.lang.String
	 */
	public static void addExtClassPath(String path) {
		addExtClassPath(new File(path));
	}

	/**
	 * 添加File对象到系统加载器中,File对象应该对应为Jar包文件,class文件 <br/>
	 * (内部捕捉了异常,并用e.printStackTrace()打印了堆栈)
	 *
	 * @Title: addClassPath
	 * @Description: 添加File对象到系统加载器中
	 * @Date May 4, 2014 29:57:47 AM
	 * @modifyDate May 4, 2014 29:57:47 AM
	 * @param dirOrJar File对象 java.io.File
	 */
	@SuppressWarnings("all")
	public static void addClassPath(File dirOrJar) {
		try {
			addURL2SystemClassLoader(dirOrJar.toURL());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加File对象到扩展加载器中 <br/>
	 * (File对象应该对应为Jar包文件,class文件) (内部捕捉了异常,并用e.printStackTrace()打印了堆栈)
	 * 
	 * @Title: addExtClassPath
	 * @Description: 添加File对象到扩展加载器中
	 * @Date May 4, 2014 29:59:48 AM
	 * @modifyDate May 4, 2014 29:59:48 AM
	 * @param dirOrJar File对象 java.io.File
	 */
	@SuppressWarnings("all")
	public static void addExtClassPath(File dirOrJar) {
		try {
			addURL2ExtClassLoader(dirOrJar.toURL());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		if (args.length == 1) {
			String libPath = args[0];
			File fs = new File(libPath.toString());
			if (!fs.exists()) {
				System.out.println("目录不存在");
				System.exit(0);
			}
			String[] libs = fs.list();
			if ((libs == null || libs.length < 1)) {
				System.out.println("没有可加载Jar文件.......");
				System.exit(0);
			}
			if (libs != null) {
				/** 加载Jar包 */
				for (String libFile : libs) {
					if (libFile.endsWith("jar")) {
						System.out.println("开始加载jar包:" + libFile);
						ClassLoaderUtil.addClassPath(libFile);
					}
				}
			}
		}
		Gson cGson = new Gson();
		Decoder base = Base64.getDecoder();
		System.out.println(base.decode("cc".getBytes()));
		System.out.println("-------------加载成功-----------------------");
	}

}

直接使用ClassLoaderUtil.addClassPath("C:\\Users\\Administrator\\Desktop\\lib\\gson-2.8.0.jar");指定绝对路劲

package com.madman.base;

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Base64;
import java.util.Base64.Decoder;

import com.google.gson.Gson;

import sun.misc.Launcher;

/**
 * 类加载器分为:引导加载器-扩展加载器-系统加载器-用户自定义加载器 一般情况下:加载器的原则是:先交于上层加载器加载,如果加载失败,在由自己加载。
 * 因为官方对于类加载器进行了:双亲委派模式进行修饰, 可以保证类加载,尽量不会出现不同加载器加载同一个类的情况出现 具体情况请查询类加载器的描述 <br/>
 * 
 * @ClassName: ClassLoaderUtil<br/>
 * @Description: 类加载器的工具类,(主要用于把class类加载到jvm中)<br/>
 * @version 1.0<br/>
 * @since JDK 1.6<br/>
 * @since PlatForm 1.0<br/>
 * 
 *        Copyright: Copyright (c) 2014 Company:www.imobpay.com<br/>
 */
@SuppressWarnings("restriction")
public class ClassLoaderUtil {

	/** 参数 */
	private static Method addURL;
	/**
	 * 静态块 <br/>
	 * 
	 * @Title: getSystemClassLoader<br/>
	 * @Description: 静态块,用来得到URLClassLoader加载类中的addURL方法<br/>
	 * @Date May 4, 2014 29:19:03 AM<br/>
	 * @modifyDate May 4, 2014 29:19:03 AM<br/>
	 */
	static {
		try {
			addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
		} catch (Exception e) {
			e.printStackTrace();
		}
		addURL.setAccessible(true);
	}

	/** 系统参数 */
	private static URLClassLoader system = (URLClassLoader) getSystemClassLoader();
	/** 系统参数 */
	private static URLClassLoader ext = (URLClassLoader) getExtClassLoader();

	/**
	 * 获取系统的类加载器<br/>
	 * 
	 * @Title: getSystemClassLoader<br/>
	 * @Description: 获取系统的类加载器<br/>
	 * @Date May 4, 2014 29:19:03 AM<br/>
	 * @modifyDate May 4, 2014 29:19:03 AM<br/>
	 * @return ClassLoader 类加载器对象 java.lang.ClassLoader<br/>
	 */
	public static ClassLoader getSystemClassLoader() {
		return ClassLoader.getSystemClassLoader();
	}

	/**
	 * 获取jdk中ext目录中的加载器,扩展类加载器<br/>
	 *
	 * @Title: getExtClassLoader<br/>
	 * @Description: 获取jdk中ext目录中的加载器,扩展类加载器<br/>
	 * @Date May 4, 2014 29:21:38 AM<br/>
	 * @modifyDate May 4, 2014 29:21:38 AM<br/>
	 * @return ClassLoader 类加载器对象 java.lang.ClassLoader<br/>
	 */
	public static ClassLoader getExtClassLoader() {
		return getSystemClassLoader().getParent();
	}

	/**
	 * 获取引导加载器加载的URL数组 , 因为引导加载需要加载环境变量中配置的ClassPath中的jar,所有由配置决定加载了几个路径下的东西 <br/>
	 * 
	 * @Title: getBootstrapURLs<br/>
	 * @Description: 获取引导加载器加载的URL数组<br/>
	 * @Date May 4, 2014 29:40:28 AM<br/>
	 * @modifyDate May 4, 2014 29:40:28 AM<br/>
	 * @return URL[] URL数组 java.net.URL[]<br/>
	 */
	@SuppressWarnings("all")
	public static URL[] getBootstrapURLs() {
		return Launcher.getBootstrapClassPath().getURLs();
	}

	/**
	 * 获取系统加载器加载的URL数组 <br/>
	 * 
	 * @Title: getSystemURLs<br/>
	 * @Description: 获取系统加载器加载的URL数组<br/>
	 * @Date May 4, 2014 29:42:33 AM<br/>
	 * @modifyDate May 4, 2014 29:42:33 AM<br/>
	 * @return URL[] URL数组 java.net.URL[]<br/>
	 */
	public static URL[] getSystemURLs() {
		return system.getURLs();
	}

	/**
	 * 获取扩展加载器加载的URL数组<br/>
	 *
	 * @Title: getExtURLs<br/>
	 * @Description: 获取扩展加载器加载的URL数组<br/>
	 * @Date May 4, 2014 29:43:29 AM<br/>
	 * @modifyDate May 4, 2014 29:43:29 AM<br/>
	 * @return URL[] URL数组 java.net.URL[]<br/>
	 */
	public static URL[] getExtURLs() {
		return ext.getURLs();
	}

	/**
	 * 输出URL数组的内容到PrintStream流中 <br/>
	 * 
	 * @Title: list<br/>
	 * @Description: 输出URL数组的内容到PrintStream流中<br/>
	 * @Date May 4, 2014 29:44:48 AM<br/>
	 * @modifyDate May 4, 2014 29:44:48 AM
	 * @param ps        输出的流对象 java.io.PrintStream<br/>
	 * @param classPath URL数组 java.net.URL[]<br/>
	 */
	private static void list(PrintStream ps, URL[] classPath) {
		for (int i = 0; i < classPath.length; i++) {
			ps.println(classPath[i]);
		}
	}

	/**
	 * 将引导加载器中的加载URL数组输出到System.out中
	 *
	 * @Title: listBootstrapClassPath
	 * @Description: 将引导加载器中的加载URL数组打印到System.out中
	 * @Date May 4, 2014 29:46:00 AM
	 * @modifyDate May 4, 2014 29:46:00 AM
	 */
	public static void listBootstrapClassPath() {
		listBootstrapClassPath(System.out);
	}

	/**
	 * 将引导加载器中的加载URL数组输出到PrintStream中
	 *
	 * @Title: listBootstrapClassPath
	 * @Description: 将引导加载器中的加载URL数组输出到PrintStream中
	 * @Date May 4, 2014 29:46:59 AM
	 * @modifyDate May 4, 2014 29:46:59 AM
	 * @param ps 输出流PrintStream java.io.PrintStream
	 */
	public static void listBootstrapClassPath(PrintStream ps) {
		ps.println("BootstrapClassPath:");
		list(ps, getBootstrapClassPath());
	}

	/**
	 * 将系统加载器中的加载URL数组输出到System.out中
	 *
	 * @Title: listSystemClassPath
	 * @Description: 将系统加载器中的加载URL数组输出到System.out中
	 * @Date May 4, 2014 29:48:21 AM
	 * @modifyDate May 4, 2014 29:48:21 AM
	 */
	public static void listSystemClassPath() {
		listSystemClassPath(System.out);
	}

	/**
	 * 将系统加载器中的加载URL数组输出到PrintStream中
	 *
	 * @Title: listSystemClassPath
	 * @Description: 将系统加载器中的加载URL数组输出到PrintStream中
	 * @Date May 4, 2014 29:49:02 AM
	 * @modifyDate May 4, 2014 29:49:02 AM
	 * @param ps 输出流PrintStream java.io.PrintStream
	 */
	public static void listSystemClassPath(PrintStream ps) {
		ps.println("SystemClassPath:");
		list(ps, getSystemClassPath());
	}

	/**
	 * 将扩展加载器中的加载URL数组输出到System.out中
	 *
	 * @Title: listExtClassPath
	 * @Description: 将扩展加载器中的加载URL数组输出到System.out中
	 * @Date May 4, 2014 29:50:01 AM
	 * @modifyDate May 4, 2014 29:50:01 AM
	 */
	public static void listExtClassPath() {
		listExtClassPath(System.out);
	}

	/**
	 * 将扩展加载器中的加载URL数组输出到PrintStream中
	 *
	 * @Title: listSystemClassPath
	 * @Description: 将扩展加载器中的加载URL数组输出到PrintStream中
	 * @Date May 4, 2014 29:50:31 AM
	 * @modifyDate May 4, 2014 29:50:31 AM
	 * @param ps 输出流PrintStream java.io.PrintStream
	 */
	public static void listExtClassPath(PrintStream ps) {
		ps.println("ExtClassPath:");
		list(ps, getExtClassPath());
	}

	/**
	 * 获取引导加载器加载的URL数组; 因为引导加载需要加载环境变量中配置的ClassPath中的jar,所有由配置决定加载了几个路径下的东西
	 *
	 * @Title: getBootstrapClassPath
	 * @Description: 获取引导加载器加载的URL数组
	 * @Date May 4, 2014 29:51:31 AM
	 * @modifyDate May 4, 2014 29:51:31 AM
	 * @return URL[] URL数组 java.net.URL[]
	 */
	public static URL[] getBootstrapClassPath() {
		return getBootstrapURLs();
	}

	/**
	 * 获取系统加载器加载的URL数组
	 *
	 * @Title: getSystemClassPath
	 * @Description: 获取系统加载器加载的URL数组
	 * @Date May 4, 2014 29:52:35 AM
	 * @modifyDate May 4, 2014 29:52:35 AM
	 * @return URL[] URL数组 java.net.URL[]
	 */
	public static URL[] getSystemClassPath() {
		return getSystemURLs();
	}

	/**
	 * 获取扩展加载器加载的URL数组
	 *
	 * @Title: getExtClassPath
	 * @Description: 获取扩展加载器加载的URL数组
	 * @Date May 4, 2014 29:53:09 AM
	 * @modifyDate May 4, 2014 29:53:09 AM
	 * @return URL[] URL数组 java.net.URL[]
	 */
	public static URL[] getExtClassPath() {
		return getExtURLs();
	}

	/**
	 * 添加URL到系统加载器中,URL应该为Jar包的绝对路径,class文件的绝对路径 <br/>
	 * 内部捕捉了异常,并用e.printStackTrace()打印了堆栈
	 *
	 * @Title: addURL2SystemClassLoader
	 * @Description: 添加URL到系统加载器中
	 * @Date May 4, 2014 29:53:30 AM
	 * @modifyDate May 4, 2014 29:53:30 AM
	 * @param url 需要添加的URL java.net.URL
	 */
	public static void addURL2SystemClassLoader(URL url) {
		try {
			addURL.invoke(system, new Object[] { url });
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加URL到扩展加载器中,URL应该为Jar包的绝对路径,class文件的绝对路径 <br/>
	 * (内部捕捉了异常,并用e.printStackTrace()打印了堆栈)
	 *
	 * @Title: addURL2ExtClassLoader
	 * @Description: 添加URL到扩展加载器中
	 * @Date May 4, 2014 29:55:06 AM
	 * @modifyDate May 4, 2014 29:55:06 AM
	 * @param url 需要添加的URL java.net.URL
	 */
	public static void addURL2ExtClassLoader(URL url) {
		try {
			addURL.invoke(ext, new Object[] { url });
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加String路径到系统加载器中,String路径应该为Jar包的绝对路径,class文件的绝对路径
	 * 
	 * @Title: addClassPath
	 * @Description: 添加String路径到系统加载器中
	 * @Date May 4, 2014 29:55:58 AM
	 * @modifyDate May 4, 2014 29:55:58 AM
	 * @param path String路径 java.lang.String
	 */
	public static void addClassPath(String path) {
		addClassPath(new File(path));
	}

	/**
	 * 添加String路径到扩展加载器中,String路径应该为Jar包的绝对路径,class文件的绝对路径
	 * 
	 * @Title: addExtClassPath
	 * @Description: 添加String路径到扩展加载器中
	 * @Date May 4, 2014 29:57:52 AM
	 * @modifyDate May 4, 2014 29:57:52 AM
	 * @param path String路径 java.lang.String
	 */
	public static void addExtClassPath(String path) {
		addExtClassPath(new File(path));
	}

	/**
	 * 添加File对象到系统加载器中,File对象应该对应为Jar包文件,class文件 <br/>
	 * (内部捕捉了异常,并用e.printStackTrace()打印了堆栈)
	 *
	 * @Title: addClassPath
	 * @Description: 添加File对象到系统加载器中
	 * @Date May 4, 2014 29:57:47 AM
	 * @modifyDate May 4, 2014 29:57:47 AM
	 * @param dirOrJar File对象 java.io.File
	 */
	@SuppressWarnings("all")
	public static void addClassPath(File dirOrJar) {
		try {
			addURL2SystemClassLoader(dirOrJar.toURL());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加File对象到扩展加载器中 <br/>
	 * (File对象应该对应为Jar包文件,class文件) (内部捕捉了异常,并用e.printStackTrace()打印了堆栈)
	 * 
	 * @Title: addExtClassPath
	 * @Description: 添加File对象到扩展加载器中
	 * @Date May 4, 2014 29:59:48 AM
	 * @modifyDate May 4, 2014 29:59:48 AM
	 * @param dirOrJar File对象 java.io.File
	 */
	@SuppressWarnings("all")
	public static void addExtClassPath(File dirOrJar) {
		try {
			addURL2ExtClassLoader(dirOrJar.toURL());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
        ClassLoaderUtil.addClassPath("C:\\Users\\Administrator\\Desktop\\lib\\gson-2.8.0.jar");

		if (args.length == 1) {
			String libPath = args[0];
			File fs = new File(libPath.toString());
			if (!fs.exists()) {
				System.out.println("目录不存在");
				System.exit(0);
			}
			String[] libs = fs.list();
			if ((libs == null || libs.length < 1)) {
				System.out.println("没有可加载Jar文件.......");
				System.exit(0);
			}
			if (libs != null) {
				/** 加载Jar包 */
				for (String libFile : libs) {
					if (libFile.endsWith("jar")) {
						System.out.println("开始加载jar包:" + libFile);
						ClassLoaderUtil.addClassPath(libFile);
					}
				}
			}
		}
		Gson cGson = new Gson();
		Decoder base = Base64.getDecoder();
		System.out.println(base.decode("cc".getBytes()));
		System.out.println("-------------加载成功-----------------------");
	}

}

打包完之后就可以直接运行了java -jar .\xx.jar;

猜你喜欢

转载自blog.csdn.net/u010316188/article/details/88843493
今日推荐