`
wangyanlong0107
  • 浏览: 502834 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】运行jar应用程序引用其他jar包的四种方法

 
阅读更多

大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口。

 

具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。

 

比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName

我们就只要在MANIFEST.MF里面添加如下一句话:

Main-Class: test.someClassName

 

 然后我们可以在控制台里输入java -jar  test.jar即可以运行这个jar。

 

但是我们这个项目需要引用其他第三方的jar包,在eclipse里面以项目jar包的形式引用了这个叫做some.jar的包,当时放在项目的lib子目录下,最后项目打包时把这个some.jar也打进来了,但是用java -jar执行这个test.jar的时候报找不到Class异常,原因就是jar引用不到放在自己内部的jar包。

 

那怎么办?

 

运行时将其加入classpath的方式行不行?就是在运行jar的同时加入classpath参数:

java -classpath some.jar  -jar test.jar

 

这种方式是不行的,因为使用classpath指定的jar是由AppClassloader来加载,java 命令 加了-jar 参数以后,AppClassloader就只关注test.jar范围内的class了,classpath参数失效。

 

那该怎么引用其他的jar包呢?

 

方法一、使用Bootstrap Classloader来加载这些类。

 

我们可以在运行时使用如下参数:

 

 

-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.

win32     java -Xbootclasspath/a: some.jar;some2.jar;  -jar test.jar
unix          java -Xbootclasspath/a: some.jar:some2.jar:  -jar test.jar
win32系统每个jar用分号隔开,unix系统下用冒号隔开

 

 

 

方法二、使用Extension Classloader来加载

 

你可以把需要加载的jar都扔到%JRE_HOME%/lib/ext下面,这个目录下的jar包会在Bootstrap Classloader工作完后由Extension Classloader来加载。非常方便,非常省心。:)

 

 

 

方法三、还是用AppClassloader来加载,不过不需要classpath参数了

 

我们在MANIFEST.MF中添加如下代码:

Class-Path: lib/some.jar

 

lib是和test.jar同目录的一个子目录,test.jar要引用的some.jar包就在这里面。

然后测试运行,一切正常!

 

如果有多个jar包需要引用的情况:

Class-Path: lib/some.jar lib/some2.jar

每个单独的jar用空格隔开就可以了。注意使用相对路径。

 

另:如果META-INF 下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。

 

 

方法四、自定义Classloader来加载

这种方法是终极解决方案,基本上那些知名java应用都是那么干的,如tomcat、jboss等等。

这种方式有点复杂,需要专门开贴讨论。关于ClassLoader的原理和自定义ClassLoader可以参考这篇 http://longdick.iteye.com/blog/442213。

 

 

总结:

以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。

分享到:
评论

相关推荐

    java项目jar包转dll文件.net引用

    Java运行在Java虚拟机(JVM)上,而.NET应用程序则依赖于微软的公共语言运行时(CLR)。要让.NET程序能够调用Java代码,我们需要一个中间桥梁,这就是IKVM.NET。 IKVM.NET是一个开源项目,它实现了Java虚拟机的部分...

    fat Jar生成jar不能被引用解决方法

    Fat Jar是一种特殊的JAR文件格式,它可以将所有依赖项打包到一个JAR文件中,使得应用程序可以独立运行。但是,在某些情况下,Fat Jar生成的jar文件可能不能被正确地引用,导致应用程序无法正常运行。那么,如何解决...

    java调用Kettle引用jar包.zip

    总之,Java调用Kettle通过引入相关jar包并利用其API,能够无缝地将强大的Kettle ETL功能集成到Java应用程序中,从而实现更复杂的业务逻辑和数据处理需求。这为开发人员提供了更大的灵活性,同时利用了Kettle的可视化...

    Launch4j 教程——JAR应用程序生成exe

    ### Launch4j 教程——JAR应用程序生成exe #### 一、介绍 Launch4j 是一款用于将 Java 应用程序(JAR 文件)封装为 Windows 本地可执行文件 (.exe) 的工具。它提供了丰富的功能,如本地弹出屏幕、应用程序图标定制...

    Jar打包(解决eclipse无法打包含有第三方架包问题)

    在Java开发过程中,将项目打包成...总之,fat jar是解决Eclipse打包含第三方库问题的一种有效方法,通过整合所有依赖,使Java应用程序能够在任何环境中独立运行。了解和掌握这一技术,对于Java开发者来说是非常重要的。

    关于执行java命令引入外部jar包方法

    总之,无论是通过修改环境变量还是在命令行中使用`-cp`参数,正确地引入外部JAR包对于构建功能完整的Java应用程序至关重要。掌握这些技巧,可以帮助开发者更高效地管理和利用外部库,提高项目的可维护性和扩展性。

    jar转dll.zip

    通过IKVM,Java类库可以被.NET应用程序直接引用,反之亦然,.NET组件也可以在Java环境中使用。 二、转换过程 1. 安装IKVM:解压"jar转dll.zip",其中包含不同架构(x86和x64)的bin目录,里面含有IKVM的可执行文件...

    ext的jar包ext的jar包ext的jar包

    如果这个jar包包含公共API,那么它需要被正确添加到运行时的类路径中,以便其他程序可以引用它的类和方法。 5. **API Documentation (Javadoc)**:为了有效地使用这个jar包,开发者通常需要访问API文档,了解其提供...

    jar包修改神器.rar

    在IT行业中,jar包是Java应用程序的标准打包格式,它包含了类文件、资源文件以及元数据。当多个jar包包含相同类名时,可能会引发版本冲突问题。为了应对这种问题,"jar包修改神器"应运而生。这个压缩包文件提供了...

    用于servlet程序的开发的servlet-jar包

    Servlet是Java平台上的一个核心组件,它允许开发者创建动态web应用程序。Servlet API是Java Servlet规范的一部分,它定义了服务器端程序如何与HTTP协议交互以及如何处理来自web客户端的请求并返回响应。`servlet.jar...

    jar文件 变成dll

    在.NET框架中,DLL是共享代码的主要形式,可以在多个应用程序之间重用。Java的jar文件则包含了编译后的字节码,用于Java虚拟机(JVM)执行。要实现这一转换,我们需要借助一个名为IKVM的开源工具。 **IKVM工具详解...

    uniAPPpush所需jar包.zip

    手机推送服务是现代移动应用中的关键组成部分,它允许应用程序在后台向用户的设备发送通知,即使应用未在前台运行。uniAPP的push服务就是这样一个工具,它帮助开发者实现在uniAPP应用中集成推送通知功能,提高用户...

    编写java程序jar包

    Java程序的jar(Java Archive)包是Java平台特有的打包机制,它将多个类文件、资源文件和元数据打包成一个单一的可执行文件,...通过理解jar包的工作原理和使用方法,开发者能够更好地管理和部署自己的Java应用程序。

    kafka需要的jar包集合

    "kafka需要的jar包集合"这个标题暗示了我们正在讨论的是用于Java开发Kafka应用程序所需的依赖库。这些JAR文件通常包含API接口、实现类和其他必要的组件,使得Java程序能够连接到Kafka集群,生产或消费消息。 首先,...

    删除无用的jar包的插件

    因此,在实际操作中,建议先进行充分的测试,确保删除jar包不会影响程序的正常运行。 此外,还有一些自动化工具,如ProGuard和DexGuard,它们在代码混淆的同时,也能去除未使用的类和方法,进一步优化应用大小。...

    程序运行所需jar包

    标题“程序运行所需jar包”指的是在开发或执行Java应用程序时必不可少的库文件。这些JAR文件包含了各种功能模块,如数据库连接、图形用户界面(GUI)、网络通信等,它们是程序能够正常运行的关键组件。 `ideajar`,...

    weblogic.jar/wlclient.jar/wls-api.jar相关jar包

    这四个JAR文件中的`api.jar`可能指的是WebLogic的其他API集合,它可能包含了特定版本的WebLogic Server提供的额外接口和类,用于扩展或定制服务器行为。 在实际开发过程中,开发者需要根据具体需求选择引入这些JAR...

    Java 自动加载JAR文件并运行其中的类方法

    它是一个归档文件格式,包含了一个或多个.class文件,这些文件构成了Java应用程序的可执行代码。JAR文件可以包含一个清单(MANIFEST.MF)文件,用于指定启动类和其他元数据。 要自动加载JAR文件并运行其中的类方法...

    Java jar打包成exe应用程序

    Java jar打包成exe应用程序是一种将Java程序转换为可执行文件(.exe)的过程,以便在没有Java环境的计算机上也能运行。这主要涉及到Java的跨平台性和可移植性,以及如何将Java字节码转化为Windows操作系统能直接执行...

Global site tag (gtag.js) - Google Analytics