很多情况都会需要运行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