动态加载jar包(二)

时间:2022-09-19 11:18:32

上次说的加载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"}