`
longdick
  • 浏览: 584353 次
  • 性别: Icon_minigender_1
  • 来自: 0
社区版块
存档分类
最新评论

运行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。

 

 

总结:

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

 


分享到:
评论
6 楼 loomz 2012-04-28  
关键是方法三中:
另:如果META-INF 下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。
5 楼 loomz 2012-04-28  
牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X,牛X!!!!!!!!!!!!

太牛XX了
4 楼 myseo 2009-09-15  
写个bat吧
set CLASSPATH=xxxxxxxxxxxxx
java -cp %CLASSPATH% mainClass
3 楼 clasp 2009-02-19  
呵!学习了。
2 楼 chenwenxuan 2009-02-14  
<div class="quote_title">longdick 写道</div>
<div class="quote_div">
<p> </p>
<p>运行时将其加入classpath的方式行不行?就是在运行jar的同时加入classpath参数:</p>
<p>java -classpath some.jar  -jar test.jar</p>
<p> </p>
<p>这种方式应该能解决问题吧,试一下,还是不行。</p>
<p>查了下资料,原来使用java -jar 命令运行jar包时classpath参数将会失效,所以,这种方式也不行。</p>
<p> </p>
</div>
<p>这样不可以吗?</p>
<p> </p>
<p>java -cp some.jar;test.jar test.someClassName</p>
1 楼 liufeng820 2009-02-14  
自己写一个 classloader 吧..说白了你这个就是类似于动态加载呗..

相关推荐

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

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

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

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

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

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

    java调用Kettle引用jar包.zip

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

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

    在Java开发过程中,将项目打包成可执行的JAR文件是一项常见的任务,这使得应用程序能够独立于开发环境运行。然而,Eclipse IDE在默认情况下,对于包含第三方库的项目打包时可能会遇到问题,因为它并不自动将这些依赖...

    编写java程序jar包

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

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

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

    jar包修改神器.rar

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

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

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

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

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

    删除无用的jar包的插件

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

    java 实用jar包 集合

    - JDBC驱动:这些jar包如mysql-connector-java.jar、ojdbc14.jar等,提供了与MySQL、Oracle等数据库的连接功能,遵循Java Database Connectivity标准,使Java应用程序能够与各种数据库进行交互。 2. **SSH整合所需...

    uniAPPpush所需jar包.zip

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

    谷歌翻译API,jar包

    谷歌翻译API jar包是一款小巧而实用的工具,它允许开发者在自己的Java应用程序中集成谷歌的在线翻译功能。这款jar包简化了与谷歌翻译服务的交互,使得开发者无需深入理解复杂的API文档,也能轻松实现文本的多语言...

    jar打包,jar打包

    ### Java应用程序打包详解:利用JAR文件简化发布流程 在Java开发过程中,打包应用程序以便于部署和分发是一项重要的步骤。对于初次接触这一领域的开发者来说可能会遇到一定的挑战,但Java平台提供了一系列强大的...

    maven打可执行JAR包

    - 在运行JAR时,如果有外部配置文件或其他资源文件,需要确保这些文件与JAR在同一目录下或通过类路径正确引用。 - 如果你的项目有多个模块,可能需要调整构建过程,确保正确处理模块间的依赖关系。 通过以上两种...

    各种jar包

    - 可执行JAR:封装了主类和所有依赖,可以直接运行,常用于桌面应用或命令行工具。 - 更新库JAR:如JavaFX,用于提供图形用户界面和多媒体功能。 在开发过程中,JAR包的管理是关键。Maven和Gradle这样的构建工具...

    达梦数7据库j驱动包及方言包,maven依赖jar包,DM达梦数据库jdbc-jar包dialect方言jar包

    例如,DmDialect-for-hibernate4.0-7.6.0.165.jar文件就是为Hibernate 4.0设计的达梦数据库方言实现,它帮助Hibernate适配达梦数据库的SQL语法,从而在不修改代码的情况下,使应用程序能够在达梦数据库上运行。...

    java开发jar包

    总结来说,Java开发中的JAR包是程序分发和执行的重要载体,涵盖了从创建、运行到维护的一系列流程,对于理解和掌握Java应用程序的生命周期至关重要。理解并熟练运用JAR包技术,能有效地提高开发效率和软件质量。

Global site tag (gtag.js) - Google Analytics