大家都知道一个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。
总结:
以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。
分享到:
- 2009-02-13 22:54
- 浏览 36669
- 评论(6)
- 论坛回复 / 浏览 (2 / 15771)
- 查看更多
相关推荐
Fat Jar是一种特殊的JAR文件格式,它可以将所有依赖项打包到一个JAR文件中,使得应用程序可以独立运行。但是,在某些情况下,Fat Jar生成的jar文件可能不能被正确地引用,导致应用程序无法正常运行。那么,如何解决...
总之,Java调用Kettle通过引入相关jar包并利用其API,能够无缝地将强大的Kettle ETL功能集成到Java应用程序中,从而实现更复杂的业务逻辑和数据处理需求。这为开发人员提供了更大的灵活性,同时利用了Kettle的可视化...
总之,无论是通过修改环境变量还是在命令行中使用`-cp`参数,正确地引入外部JAR包对于构建功能完整的Java应用程序至关重要。掌握这些技巧,可以帮助开发者更高效地管理和利用外部库,提高项目的可维护性和扩展性。
### Launch4j 教程——JAR应用程序生成exe #### 一、介绍 Launch4j 是一款用于将 Java 应用程序(JAR 文件)封装为 Windows 本地可执行文件 (.exe) 的工具。它提供了丰富的功能,如本地弹出屏幕、应用程序图标定制...
在Java开发过程中,将项目打包成可执行的JAR文件是一项常见的任务,这使得应用程序能够独立于开发环境运行。然而,Eclipse IDE在默认情况下,对于包含第三方库的项目打包时可能会遇到问题,因为它并不自动将这些依赖...
Java程序的jar(Java Archive)包是Java平台特有的打包机制,它将多个类文件、资源文件和元数据打包成一个单一的可执行文件,...通过理解jar包的工作原理和使用方法,开发者能够更好地管理和部署自己的Java应用程序。
Servlet是Java平台上的一个核心组件,它允许开发者创建动态web应用程序。Servlet API是Java Servlet规范的一部分,它定义了服务器端程序如何与HTTP协议交互以及如何处理来自web客户端的请求并返回响应。`servlet.jar...
在IT行业中,jar包是Java应用程序的标准打包格式,它包含了类文件、资源文件以及元数据。当多个jar包包含相同类名时,可能会引发版本冲突问题。为了应对这种问题,"jar包修改神器"应运而生。这个压缩包文件提供了...
这四个JAR文件中的`api.jar`可能指的是WebLogic的其他API集合,它可能包含了特定版本的WebLogic Server提供的额外接口和类,用于扩展或定制服务器行为。 在实际开发过程中,开发者需要根据具体需求选择引入这些JAR...
手机推送服务是现代移动应用中的关键组成部分,它允许应用程序在后台向用户的设备发送通知,即使应用未在前台运行。uniAPP的push服务就是这样一个工具,它帮助开发者实现在uniAPP应用中集成推送通知功能,提高用户...
Java运行在Java虚拟机(JVM)上,而.NET应用程序则依赖于微软的公共语言运行时(CLR)。要让.NET程序能够调用Java代码,我们需要一个中间桥梁,这就是IKVM.NET。 IKVM.NET是一个开源项目,它实现了Java虚拟机的部分...
因此,在实际操作中,建议先进行充分的测试,确保删除jar包不会影响程序的正常运行。 此外,还有一些自动化工具,如ProGuard和DexGuard,它们在代码混淆的同时,也能去除未使用的类和方法,进一步优化应用大小。...
- JDBC驱动:这些jar包如mysql-connector-java.jar、ojdbc14.jar等,提供了与MySQL、Oracle等数据库的连接功能,遵循Java Database Connectivity标准,使Java应用程序能够与各种数据库进行交互。 2. **SSH整合所需...
"kafka需要的jar包集合"这个标题暗示了我们正在讨论的是用于Java开发Kafka应用程序所需的依赖库。这些JAR文件通常包含API接口、实现类和其他必要的组件,使得Java程序能够连接到Kafka集群,生产或消费消息。 首先,...
### Java应用程序打包详解:利用JAR文件简化发布流程 在Java开发过程中,打包应用程序以便于部署和分发是一项重要的步骤。对于初次接触这一领域的开发者来说可能会遇到一定的挑战,但Java平台提供了一系列强大的...
Java开发过程中,jar包是常用的部署和分发方式,它包含了一组类文件和其他资源,用于构建可执行的Java应用程序或库。当我们需要更新或优化软件时,可能会产生新的jar包,这时候就需要对比两个jar包之间的差异,以...
- 在运行JAR时,如果有外部配置文件或其他资源文件,需要确保这些文件与JAR在同一目录下或通过类路径正确引用。 - 如果你的项目有多个模块,可能需要调整构建过程,确保正确处理模块间的依赖关系。 通过以上两种...
谷歌翻译API jar包是一款小巧而实用的工具,它允许开发者在自己的Java应用程序中集成谷歌的在线翻译功能。这款jar包简化了与谷歌翻译服务的交互,使得开发者无需深入理解复杂的API文档,也能轻松实现文本的多语言...
- 可执行JAR:封装了主类和所有依赖,可以直接运行,常用于桌面应用或命令行工具。 - 更新库JAR:如JavaFX,用于提供图形用户界面和多媒体功能。 在开发过程中,JAR包的管理是关键。Maven和Gradle这样的构建工具...