`

工程中使用java代码加载第三方jar文件

阅读更多
package com.send.start;

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class Start {

    public static String libPath = "";
    public static ClassLoader classLoader;

    /**
     * @param args
     */
    public static void main(String[] args) {
        libPath = args[0];
        createClassLoader();
        try {
            Class clazz = classLoader.loadClass("cmbcagent.tianjin.gjj.dz.MapSender");
            Method m = clazz.getDeclaredMethod("start", new Class[0]);
            m.invoke(clazz.newInstance(), new Object[0]);

        } catch (Exception e) {
            throw new RuntimeException("");
        }

    }

    public static void createClassLoader() {
        File localFile1 = new File(libPath);
        checkLibDir(localFile1);
        ArrayList localArrayList = new ArrayList(64);
        File localFile2 = new File(libPath);
        getAllJarUrl(localArrayList, localFile2);
        // File localFile3 = new File(this.libPath + "ext");
        // getAllJarUrl(localArrayList, localFile3);
        URL[] arrayOfURL = new URL[localArrayList.size()];
        localArrayList.toArray(arrayOfURL);
        System.out.println("******arrayOfURL.length: " + arrayOfURL.length);
        for (int i = 0; i < arrayOfURL.length; ++i)
            System.out.println(arrayOfURL[i]);
        AppendableURLClassloader localAppendableURLClassloader = new AppendableURLClassloader(arrayOfURL, Thread.currentThread()
                .getContextClassLoader());
        classLoader = localAppendableURLClassloader;
        Thread.currentThread().setContextClassLoader(classLoader);
    }

    public static void getAllJarUrl(List paramList, File paramFile) {
        checkLibDir(paramFile);
        String[] arrayOfString = listAllJarFile(paramFile);
        File localFile = null;
        int i = 0;
        try {
            i = 0;
            while (true) {
                if (i >= arrayOfString.length)
                    break;
                localFile = new File(paramFile, arrayOfString[i]);
                localFile = localFile.getCanonicalFile();
                paramList.add(localFile.toURL());
                ++i;
            }
        } catch (Exception localException) {
            localException.printStackTrace();
            throw new RuntimeException("Bootstrap.listJar");
        }
    }

    public static String[] listAllJarFile(File paramFile) {
        return paramFile.list(new FilenameFilter() {
            public boolean accept(File paramFile, String paramString) {
                return (paramString.endsWith(".jar"));
            }
        });
    }

    public static void checkLibDir(File paramFile) {
        if (!(paramFile.exists()))
            throw new IllegalArgumentException("libPath.notExist");
        if (!(paramFile.isDirectory()))
            throw new IllegalArgumentException("libPath.notDirectory");
        if (!(paramFile.canRead()))
            throw new IllegalArgumentException("libPath.canNotRead");
    }

}

 注意事项:
1.启动的类要单独放在一个jar包中,即含有main方法的类
2.main方法中不能引用第三方jar文件中的类(即通过import来导入的类只能是jvm自动加载的基本类,不能是第三方的jar),如果要引用只能通过反射机制来加载
3.main方法中主要是通过使用URLClassLoader来加载第三方的jar文件,并设置到当前线程下,然后通过反射机制来加载具体类,然后运行工程


含有Main的类只是负责通过反射机制调用主程序,起到一个入口的作用,其他不做任何业务操作

分享到:
评论

相关推荐

    在可执行jar中载入第三方jar的几个解决方法

    开发完毕,部署的时候,将开发的class打成一个可执行jar包,会发现通过Class.forName(String classname) 或ClassLoader.getSystemClassLoader().loadClass(String classname)来动态载入存在于第三方jar包中的class会抛...

    flink安装所需要的第三方jar

    flink安装所需要的第三方jar,即flink-shaded-hadoop-2-uber-2.7.5-10.0.jar

    java+swing打包jar转成exe 轻松加载第三方包

    生成swing 客户端exe文件! 加载第三方包文件

    Android.mk文件中添加第三方jar文件的方法

    下面给大家介绍Android.mk文件中添加第三方jar文件的方法,具体内容详情如下所示: 先添加: LOCAL_STATIC_JAVA_LIBRARIES += clib clib为jar文件名,没有后缀 然后下面语句中间添加 LOCAL_PREBUILT_STATIC_JAVA_...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    集成目前Android主流优秀第三方组件

    这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员快速开发自己的APP 已集成第三方开源...

    Teigha.Java 2019.02版本

    最近要求做cad文件的第三方开发,尝试申请了Teigha的免费试用版(要注册账号申请,官网上有教程,不懂得可以咨询我,在下方评论也可以),以下是我总结的基础内容 1.一个工程制图文件,也就是drawing(图纸),...

    java开源包8

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    jar包做服务nssm实例

    /lib(第三方依赖) app.jar 添加run.bat 批处理文件.内容为 java -cp lib/a.jar;lib/b.jar...(所有依赖包 ;号分隔) -jar app.jar 第二步: 将nssm 放到运行目录 在运行目录 执行命令 ------------------(对照...

    JAVA调用第三方DLL的方法

    举例:Windows平台的部署。 首先将将动态连接库(AA.dll)拷贝到PATH环境变量指定的目录下, 即动态连接库的搜索路径是由PATH环境变量指定。...需要注意的是加载的dll和jar文件是你所需要的正确版本, 避免交叉引用。

    JFinal所需的Jar

    JFinal 自身对第三方无依赖,但当需要第三方功能支持时则需要添加相应的 jar 文件 1:只有 jfinal-bin-xx.jar 文件是必需的。其它jar文件按需所用。 2:jetty-server-8.1.8.jar 用来支持无需额外安装 tomcat jetty ...

    kettle引入jar包.rar

    里面包含kettle-core-8.3.0.0-371.jar,kettle-engine-8.3.0.0-371.jar,metastore-8.3.0.0-371.jar,这三个 jar 包,如果通过 maven 引入不成功可以尝试一下通过 maven 命令将这三个jar包导入到 maven 仓库中

    玩转模板--自动代码生成工程

    工程提供所有源码,包括第三方jar包也附带源码包 注意事项: 1.需要一定的java开发基础. 2.要有java开发的集成环境,本工程没有界面,很多功能都是通过直接注释,或增加一些代码完成. 3.JDK版本必须是1.6以上,否则会报...

    JAVA_API1.6文档(中文)

    javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing....

    java开源包10

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    Android例子源码集成安卓主流优秀第三方组件框架.zip

    这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员快速开发自己的APP 已集成第三方开源...

    JavaWord类库操作API_Free Spire.Doc for Java_5.1.0

    无需依赖任何其他第三方插件,完全独立运行。 5.该压缩包包含的内容:samples文件夹中包含了多个操作Word文档功能的java代码示例DEMO;lib文件夹下包含了用于在java程序中的Spire.Doc.jar文件,在项目程序中调用接口...

    集成安卓主流优秀第三方组件框架.zip

    这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员快速开发自己的APP   已集成第三方...

Global site tag (gtag.js) - Google Analytics