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