有时我们会遇到这种情况:一堆jar文件看着麻烦,要做成一个可执行jar文件(java -jar myjar.jar xxx方式执行的jar)时,希望把所有依赖的jar包打包到可执行jar文件中,可是如何将jar文件中的jar自动加到classpath中呢?
第一反应,最直接的方法有两个:
1. 将外层的jar文件解压到一个临时目录中,通过URLClassloader加载解压出的jar文件中的类。
这种方法需要一个外部临时目录,占用了外部空间,有了外部依赖,并且解压需要耗费一定时间,对于需要快速执行的程序并不适合。因此这种方法虽然一定可行,但有很多局限性。
2. 通过Class.getResource()方法获得内部jar文件的URL,然后使用URLClassloader将这些内部jar文件中的类加载。
这种方法看起来不错,既不占用外部空间,又不需要解压,但实施起来有问题,URLClassloader无法处理“jar中jar”类型的URL!
既然这两种方法都不行(不好),只能找其他的方法了。最麻烦的方法是自己写Classloader,将jar中的jar读出来,从里面加载需要的类,这种方法可行,但需要自己写classloader,比较繁琐,有没有人已经写好了这个classloader呢?google “jar in jar”,在网上找到了One-Jar和eclipse自带的“jar in jar loader”,这两个软件都实现了加载jar中jar的classloader。从功能上来说,One-Jar功能更强一些,它允许将外层jar中的某些文件解压到文件系统中,这样当运行时需要有些文件放到文件系统中时比较方便。One-Jar是Simon tuffs老头写的,用的比较多。
另外,网上还有一个FatJar的sourceforge工程,这是一个eclipse插件,提供export wisard,可以把一个工程和相关的jar包一起export出去,直接将相关jar包展开到打出的jar包中,另外,也可以集成one-jar,此时相关的jar包不会被展开。
从eclipse3.4开始,JDT中添加了一个简化的FatJar版本,提供Runnable Jar File导出向导,导出时使用eclipse自带的“jar in jar loader”,没有用One-Jar的classloader。但个人感觉目前JDT自带的Runnable Jar File导出向导已经比FatJar好用了,不但可以将相关的jar包在打出的jar包中展开,也可以不展开,还可以把依赖jar包打到外层jar包的外面,另外,还可以直接和LaunchConfiguration集成。
分享到:
相关推荐
在jar包中加载配置文件,可以将应用的配置逻辑封装在库中,使得主应用只需关注业务逻辑,而无需关心底层实现细节。 5. **Spring的Bean定义**:配置文件通常包含Bean的定义,这些Bean代表了应用中的对象实例。通过...
在Spring MVC项目中,加载jar包中的Spring配置文件是一个常见的需求,特别是在进行SSM(Spring、Spring MVC、MyBatis)整合时。SSM框架的整合通常涉及到多个配置文件的组织和管理,其中一部分配置可能会被打包到独立...
这里的`classpath:`前缀表示从类路径中查找资源,如果应用被打包成JAR,这个配置文件会被包含在JAR的根目录下`/config/`路径中。 然而,当配置文件位于JAR的嵌套目录,例如`META-INF/config/application.properties...
然而,在将 Java 项目打包成可执行的 Jar 文件时,经常会遇到一些问题,例如如何将 Java 项目打包成可执行的 Jar 文件,并执行 Jar 包中指定的 main 方法。本文将详细介绍如何将 Java 项目打包成可执行的 Jar 文件,...
本文将深入探讨如何解决SpringBoot jar包中的文件读取问题。 首先,让我们回顾一下问题的背景。在开发SpringBoot微服务时,开发人员小明遇到了一个问题,即在本地开发环境中能够正常读取资源文件,如word文档或模板...
本篇文章将详细探讨如何在Java中正确地从JAR包中加载资源文件,并提供相应的源码示例。 首先,理解Java类路径(classpath)是关键。类路径是指Java虚拟机(JVM)查找.class文件和其他资源文件的路径。当你运行一个...
在JAR包中,资源通常与对应的类同级或者在特定的目录下。 4. **相对路径与绝对路径**: 在指定资源路径时,可以使用相对路径(相对于当前类或指定类)或绝对路径(从根目录开始)。相对路径更灵活,但可能引起找不到...
总的来说,"同一个package的类型分散在不同JAR包中"是Java生态中的一种常见实践,它既反映了类的组织策略,也涉及到了类加载、模块化和依赖管理等多个方面。理解和掌握这些知识点对于Java开发者来说至关重要,因为...
在传统的开发方式中,我们通常是将需要的jar包添加到项目的classpath中,然后重新启动服务器以便让应用程序加载新的jar包。然而,这种方式有一个缺陷,即每次添加新的jar包都需要重新启动服务器,这可能会导致应用...
- 在Java项目中,JAR文件可以添加到项目的类路径(ClassPath)中,使得项目能够找到并加载其中的类和资源。 - 使用`jar`命令行工具创建、提取或更新JAR文件。 - `MANIFEST.MF`文件在JAR中扮演重要角色,它定义了...
Java读取Jar中资源文件是一种常见的操作,在开发Java项目时,经常需要读取jar包中的资源文件。下面将详细介绍Java读取Jar中资源文件的实现代码和应用。 一、Java读取Jar中资源文件的必要性 在Java项目中,经常需要...
在 Java 开发中,JAR(Java Archive)文件是一种常用的归档格式,它允许开发者将多个类文件、资源文件及其他元数据打包到一个单独的文件中。这不仅便于管理,还提高了程序的可移植性。本文将详细介绍 JAR 文件的概念...
如果你的项目没有使用这样的环境,你需要将这些jar包添加到项目的类路径(classpath)中,以便编译和运行时能够找到它们。 总之,调用WebService接口需要一系列的Java库支持,这些库提供了从解析WSDL到构建和发送...
如果项目是一个完整的 Web 应用,并且将全程使用 Spring 框架,推荐使用单个完整的 `spring.jar` 文件,因为它包含了除 `spring-mock.jar` 外的所有 Jar 包内容。 如果只需要使用 Spring 的 IoC/DI 容器特性,则只...
1. 将`mail.jar` 和 `activation.jar` 添加到项目的类路径(classpath)中。 2. 创建一个`Properties`对象,设置邮件服务器的相关参数,如主机名、端口号、用户名和密码。 3. 创建一个`Session`对象,使用之前设置的...
- **检查Maven或Gradle配置**:确认构建工具配置是否正确,确保资源文件被包含在jar包中。在Maven中,检查`pom.xml`中的`<build>`部分,确保`<resource>`标签包含了资源文件夹。 5. **测试和调试** 使用`jar tvf ...
这个类将绑定到配置文件中的`quartz.config`前缀下的所有属性。 2. **配置文件中添加属性** 在`application.properties`中,我们需要添加相应的配置项,以供`QuartzConfigProperties`类读取。例如: ``` ...
2. **本地类路径配置**:将下载的JAR文件放入项目的`lib`目录,然后将这个目录添加到项目的类路径(Classpath)中。在Eclipse或IntelliJ IDEA等IDE中,可以通过设置项目属性或模块依赖来完成这一步。 3. **引入API*...
在实际开发中,为了使用这些JAR文件,你需要将它们添加到项目的类路径(ClassPath)中。如果你使用的是Maven或Gradle这样的构建工具,可以通过在pom.xml或build.gradle文件中指定依赖来自动管理这些库。对于Spring ...