java程序关于第三方jar包发布的另一种方法
大概我们每个人都有过这种经历,编好了一个应用,当打成jar包后,当引用第三包时却总是抛ClassNotFoundException 而无法正常运行。我现在知道的有两种解决方法,一种是在manifest.mf中设置classpath,把所需的第三方包手动加进去,还有一种就是用是用第三方打包工具了,比如fatjar。今天察看Jmeter的源代码时发现了另一种方法。为了更清楚些,下面进行举例进行说明:
先新建一个工程,建一个类,源代码如下:
package first;
import java.util.Date;
public class My {
public String getTime(){
return new Date().toString();
}
}
然后把它打成包,用来模拟第三方包,不妨取名first.jar.
然后,再建第二个工程,把刚才的包加入到这个工程中,新建类如下:
package mypackage;
import first.My;
public class Task {
public void start(String [] args){
My my = new My();
System.out.println(my.getTime());
}
}
start()方法作为咱们整个应用的入口函数,经测试发现没有问题。到此,准备工作完毕,下面开始进行解决问题的关键部分了:
新建类NewDrever,其源代码如下:
package mypackage;
import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.LinkedList;
import java.util.List;
public class NewDrever {
public static void main(String [] args){
File userDir = new File(System.getProperty("user.dir"));
String jmDir = userDir.getAbsoluteFile().getParent();
File libDirs = new File(jmDir+File.separator+"lib");
File [] libJars = libDirs.listFiles(new FilenameFilter(){
public boolean accept(File dir,String name) {
if(name.endsWith(".jar"))
return true;
return false;
}
});
List jars = new LinkedList();
//System.out.println(System.getProperty("java.class.path"));
StringBuffer classpath = new StringBuffer();
for(int i = 0;i < libJars.length;i++){
try {
jars.add(new URL("file","",libJars[i].getPath()));
classpath.append(System.getProperty("path.separator"));
classpath.append(libJars[i].getPath());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
System.setProperty("java.class.path",System.getProperty("java.class.path")+classpath.toString());
//System.out.println(System.getProperty("java.class.path"));
URLClassLoader loader = new URLClassLoader((URL[])jars.toArray(new URL[0]));
//Thread.currentThread().setContextClassLoader(loader);
try {
Class JMeter = loader.loadClass("mypackage.Task");
Object instance = JMeter.newInstance();
Method startup = JMeter.getMethod("start",new Class[]{(new String[0]).getClass()});
startup.invoke(instance,new Object[]{args});
} catch(Exception e) {
e.printStackTrace();
}
}
}
把第二个工程打成可执行的jar包,取名second.jar,新建一个文件夹,不妨取名为Test,test下面分别建lib和bin两个文件夹,把first.jar和second.jar拷贝到lib中,把second.jar再考到bin下面一份。现在还没有完毕,把bin下的second.jar的包中除了NewDrever.class全部删掉,至此完毕。这时,进到bin目录下 敲java -jar second.jar 会在控制台打出当前的时间。而时间来自"第三方包"。