现在比较流行使用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
;