小弟前段时间制作了一个爬取某个新闻页面的类,并将其制作成了jar包,请问如何动态加载这个r包,请问下步如何实现?求帮助。
源码如下:
package Test01;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Demo2 {
public static void main(String[] args) {
URL[] urls = new URL[] {};
MyClassLoader classLoader = new MyClassLoader(urls, null);
try {
classLoader.addJar(new File("E:\\JoImages\\JsoupBaidu\\com.sdzw.test.spider.baidu.jar").toURI().toURL());
Class<?> testDAO = classLoader.loadClass("com.sdzw.test.dao.TestDAO");
Method method = testDAO.getDeclaredMethod("RunBaidu");
method.invoke(null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* URLClassLoader的子类
* 添加addJar方法
* @author Administrator
*
*/
private static class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls) {
super(urls);
}
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public void addJar(URL url) {
this.addURL(url);
}
}
}
运行结果是这样的:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at Test01.Demo2.main(Demo2.java:16)
Caused by: java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at com.sdzw.test.dao.TestDAO.RunBaidu(TestDAO.java:15)
... 5 more
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 6 more
jar文件的源码是这样的:
package com.sdzw.test.dao;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class TestDAO {
public static void RunBaidu(){
Document doc;
String url="http://news.baidu.com/";
BaiduDAO dao =new BaiduDAO();
try {
doc=Jsoup.connect(url).timeout(5000).get();
Elements mon=doc.select("#body a[mon]");
for(Element e: mon){
if(e.text().trim().length()>1&&e.attr("mon").length()>1){
String linkHref=e.attr("href");
String linkText=e.text().trim();
if(linkHref.startsWith("http://news.ifeng")){
dao.saveFengHuang(linkText, linkHref);
}else if(linkHref.indexOf("baijia.baidu.com")!=-1){
System.out.println(linkHref);
dao.saveBaijia(linkText, linkHref);
}else if(linkHref.startsWith("http://news.xinhuanet.com")){
dao.savaXinhua(linkText, linkHref);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void saveBaijia(String linkText,String linkHref) throws FileNotFoundException, IOException{
//将标题转换为合法标题
linkText=LinkTextSafe(linkText);
//创建一个以标题为名称的txt文档,并将标题存放到文档中
dao.SaveFile("news/Baijia/"+linkText+".txt", linkText);
//爬取页面中的指定内容,并将其存入相对应的文件当中
List<String> getContent = getContent(linkHref,"span.time", "div.article-author-time a", "div.article-detail p");
for(String content : getContent){
dao.SaveFile("news/Baijia/"+linkText+".txt", content);
}
}