动态加载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"}
时间: 2024-07-30 23:05:58

动态加载jar包(二)的相关文章

java动态加载jar包,并运行其中的类和方法

动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一:定义一个抽象类 AbstractAction (稍后换成接口的实例) [java] view plain copy package com.java.loader; public abstract class AbstractAction { public abstract String actio

动态加载jar包

一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ("helloworld"); } } 使用eclipse的export功能导出jar包,放在/Users/liqiu/Documents/workspace/HelloWorld.jar 二.编写调用jar包的类 package com.qunar.studyspring.javajar;

Java动态加载JAR包

参考代码: package org; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.sql.Connection; import java.sql.Driver; import java.util.Properties; public class Test { public static void main(String[] args) throws Exception

Android动态加载jar/dex

http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html 前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http:/

Java中动态加载jar文件和class文件

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

关于Weblogic优先加载jar包的设置

<?xml version="1.0" encoding="UTF-8"?><weblogic-web-app> <container-descriptor>  <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor></weblogic-web-app> weblogic.xml 放到

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期 生命周期简介: servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法.这个实在服务器中new出来,然后用HashMap加的,与客户端无关.客户端之后访问只调用这个servlet的service方法. 具体分为4步: 1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次 2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次.并且可以通过config参数在 web.xml中通过(ke

Java_Java中动态加载jar文件和class文件

转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍

spring加载jar包中多个配置文件(转)

转自:http://evan0625.iteye.com/blog/1598366 在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:beanconfigs/applicationContext_1.xml, classpath*: