zoukankan      html  css  js  c++  java
  • 动态加载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"}
  • 相关阅读:
    ES6学习之装饰器
    ES6学习之Class
    ES6学习之Async函数
    ES6学习之Generator函数
    for循环及break和continue的区别
    ES6学习之Iterator和For...of循环
    js检测对象属性
    ES6学习之Promise
    ES6学习之Reflect
    Visual Studio references中的package找不到
  • 原文地址:https://www.cnblogs.com/liqiu/p/3951399.html
Copyright © 2011-2022 走看看