首页 > 代码库 > 动态加载jar包(二)

动态加载jar包(二)

上次说的加载jar包,有几个问题没有解决:

1、如果项目包含了其他的jar包如何解决?

2、如何规范上传的jar包的类和方法?

下面就解决一下上面两个问题

一、首先编写被调用的类,这次使用maven工程,并且载入了第三方jar包,阿里巴巴的fastjson包

package com.qunar.hello.hello;import java.util.HashMap;import com.alibaba.fastjson.JSON;public class HelloWorld extends Thread{    public void run(){        HashMap<String, String> m = new HashMap();        m.put("name", "liqiu");        System.out.println(JSON.toJSONString(m));    }}

二、打一个胖包,修改pom.xml,添加build

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.qunar.hello</groupId>    <artifactId>hello</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>jar</packaging>    <name>hello</name>    <url>http://maven.apache.org</url>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>3.8.1</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.1.26</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <artifactId>maven-assembly-plugin</artifactId>                <configuration>                    <descriptorRefs>                        <descriptorRef>jar-with-dependencies</descriptorRef>                    </descriptorRefs>                </configuration>            </plugin>        </plugins>    </build> </project>

三、在命令行执行:mvn assembly:assembly

这时候你会发现在target目录出现一个jar:hello-0.0.1-SNAPSHOT-jar-with-dependencies.jar

四、调用这个胖jar包

package com.qunar.studyspring.javajar;import java.net.URL;import java.net.URLClassLoader;import java.lang.reflect.Method;public class JavaJar {    public void doJar() {        try {            URL url = new URL("file:/Users/liqiu/Documents/workspace/hello/target/hello-0.0.1-SNAPSHOT-jar-with-dependencies.jar"); // 这里需要重点看URLClassLoader用法,            URLClassLoader loader = new URLClassLoader(new URL[] { url }); // URL跟我们日常见到的格式用法不太一样            Class c = loader.loadClass("com.qunar.hello.hello.HelloWorld"); // 在上面找到并加载jar包后,可以通过此            Thread myObject = (Thread) c.newInstance(); // 函数加载某个类,并使用 newInstance            myObject.run();        } catch (Exception ex) {            System.out.println(ex);                    }    }}

五、编写测试类

package com.qunar.studyspring;import org.junit.Test;import com.qunar.studyspring.javajar.JavaJar;public class JarTest {    @Test    public void sayHello(){        JavaJar javajar = new JavaJar();        javajar.doJar();    }}

六、运行的结果是:

{"name":"liqiu"}

 

动态加载jar包(二)