`

工程中使用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的类只是负责通过反射机制调用主程序,起到一个入口的作用,其他不做任何业务操作

分享到:
评论

相关推荐

    java必须第三方jar文件

    "java必须第三方jar文件"这个标题暗示了在Java开发过程中,有些功能或服务的实现离不开第三方库的支持。 首先,让我们了解一下什么是第三方库。在Java世界里,第三方库是由非Java标准库提供的额外功能集合。它们是...

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

    这个问题通常发生在使用`Class.forName()`或`ClassLoader.getSystemClassLoader().loadClass()`尝试动态加载第三方JAR中的类时。 Java虚拟机(JVM)的类加载机制是导致此问题的关键。自JDK 1.2以来,JVM采用委托...

    jdk引入第三方jar

    本篇文章将详细讲解如何在Java项目中导入并使用第三方JAR包,以及与之相关的工具和实践技巧。 首先,我们需要理解JAR(Java Archive)文件的性质。JAR是一种用于存储Java类文件、资源文件和元数据的容器,它允许...

    打包第三方Jar插件

    总之,"打包第三方Jar插件"涉及Java项目中依赖管理、构建路径设置、类加载机制、项目打包等多个方面。通过理解并熟练运用这些知识点,可以提高开发效率,减少错误,保证项目的稳定性和可维护性。在实际操作中,结合...

    flink安装所需要的第三方jar

    标题中的“flink安装所需要的第三方jar”指的是在部署和运行Apache Flink项目时,除了Flink自身的基础库之外,可能还需要依赖的一些外部JAR包。这些JAR包通常包含了Flink与其它系统的交互所需的组件,比如Hadoop。在...

    spring boot 第三方jar包抽离方案

    - **可维护性**:抽离第三方jar包使得维护更方便,同时保持了工程间的差异性,方便持续压缩代码。 - **兼容性**:在二次开发时,即使添加了新的第三方库,也不会影响原有工程的运行,因为新添加的库不会影响已抽离的...

    四个支持mp3播放的jar文件

    在Java编程环境中,开发一个MP3播放器是一个挑战性的任务...使用Java Sound API或第三方库提供的API进行音频播放控制;以及创建用户友好的GUI界面。通过熟练掌握这些技术,你可以构建出一个功能完备的Java MP3播放器。

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

    exe4j打包(包含第三方jar包)

    **步骤四:添加第三方jar包** 在“JRE选择”阶段,点击“添加”按钮来导入项目所需的第三方jar包。这一步至关重要,因为这些jar包包含了你的程序运行所依赖的类和资源。确保添加所有必要的库,包括你自己项目的编译...

    FileUpload上传第三方JAR包

    在Java Web开发中,"FileUpload上传第三方JAR包"是一个常见的需求,特别是在构建自定义应用或集成外部库时。这个过程涉及到多个知识点,包括文件上传、类路径管理以及依赖注入。下面将详细阐述这些关键点。 1. 文件...

    jar文件如何打开或者jar文件关联到java

    除了上述方法外,还可以借助于第三方工具如7-Zip等来解压JAR文件。这种方法虽然不能直接运行JAR文件中的程序,但对于查看其内部结构非常有帮助。 #### 二、JAR文件与Java环境的关联 为了使JAR文件能够像其他可...

    myeclipse打包jar文件包含第三方jar包(文档+工具)

    `FatJar`是一个第三方插件,适用于`Eclipse`和`MyEclipse`,它的主要功能是帮助开发者将所有项目依赖的库文件(即第三方JAR包)打包进最终的可执行JAR中。这样,当用户运行这个单一的JAR文件时,不需要额外配置类...

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

    这个过程涉及到将Java的JAR文件转换为Windows平台上的EXE文件,并且还需要处理第三方库的集成。以下是使用exe4j进行此操作的详细步骤和注意事项: 1. **准备阶段**: - 确保你的JAR文件、ICO图标、第三方库(存放...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    在IT行业中,有时我们需要在Java程序中调用第三方的DLL(动态链接库)文件,这通常是C或C++编写的库。Java Native Access (JNA) 是一个流行的开源框架,它允许Java代码直接调用本机库函数,而无需编写JNI(Java ...

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

    Android.mk文件是Android系统中的一个重要文件,它负责管理和编译Android应用程序中的资源文件和Java代码,而添加第三方jar文件是Android开发中一个常见的需求。本文将详细介绍如何在Android.mk文件中添加第三方jar...

    eclipse 第三方jar包配置.txt

    但是,如果希望绕过这种内置机制,直接通过修改`.classpath`文件来添加第三方JAR包,则可以按照以下步骤操作: ##### 1. 备份原`.classpath`文件 在进行任何更改之前,请先备份原`.classpath`文件,以防万一出错...

    android 混淆 去除第三方jar

    本文将深入探讨如何在Android项目中进行混淆,并特别关注如何处理第三方jar包。 首先,了解混淆的基本概念。混淆是通过重命名类、方法和变量,将其转化为简短的无意义名称,以增加逆向工程的难度。Android Studio...

    用于反编译jar为JAVA代码java -jar cfr-0.152.jar xx.jar -outputdir 路径

    - **安全审计**:检查第三方组件是否存在潜在的安全漏洞。 - **教学与培训**:演示Java字节码与源代码之间的关系。 尽管反编译在某些场景下很有用,但必须尊重软件的版权和许可协议,不得非法使用反编译结果。对于...

    获取文件编码方式的两种方式(1.cpdetector第三方jar包,包含源码elipse项目;2.EncodingDetect.java工具类)

    本篇文章将详细介绍两种常用的方法来检测Java程序中的文件编码:一是使用`cpdetector`第三方库,二是通过自定义的`EncodingDetect.java`工具类。 1. **cpdetector第三方库** `cpdetector`是一个开源的Java库,它...

    eclipse导出第三方jar包插件fatjar

    - **Libraries**: 这是最重要的部分,你需要添加所有项目依赖的第三方JAR包。点击“Add External JARs…”或“Add JARs…”,选择项目中引用的库文件。 5. 完成上述配置后,点击“Finish”开始导出过程。Eclipse会...

Global site tag (gtag.js) - Google Analytics