`
longdick
  • 浏览: 579842 次
  • 性别: 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 吧..说白了你这个就是类似于动态加载呗..

相关推荐

    DM8达梦数据库驱动包 DmJdbcDriver18.jar

    步骤二:执行 mvn install:install-file -Dfile=/xxx/xxx/DmJdbcDriver18.jar -DgroupId=com.dm -DartifactId=DmJdbcDriver18 -Dversion=1.8 -Dpackaging=jar安装(默认电脑已经安装好maven环境)

    jar文件转为exe

    第二步,打开Exe4J工具,是讲jar包打包成Exe文件的,他的使用方法也很简单,下面是方法; 引用内容 exe4j应用起来倒是相当简单。类似于傻瓜式的,只要一路next,填写和选择个别的参数就ok了。稍微懂点e文的都可以应用...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-attributes 让开发者可以使用 C# 或 .net 样式的 attributes, 是一种运行时的 api, 有点类似 doclet commons-beanutils 提供对 Java 反射和自省API的包装 commons-betwixt 这个组件提供一个XML自省...

    ojsputil.jar 片段缓存 JAR包

    标签使得JSP容器(例如Tomcat)只生成内容一次,作为应用程序范围内的JSP变量,来存储每一个缓存片段。每次JSP页面被执行时,自定义标签将缓存页面片段载入而无需再次执行JSP代码来生成输出结果。作为Jakarta工程的...

    jspsmart.jar包及帮助文档

    作用:将所有上传文件对象以Collection的形式返回,以便其它应用程序引用,浏览上传文件信息。 原型:public Collection getCollection() 5、getEnumeration 作用:将所有上传文件对象以Enumeration(枚举)的...

    JPackIt JAVA项目程序打包

    JPackIt可以把Java工程打包成一个可执行的包(如:jar,class或exe).包括所有Java应用程序资源如:代码,图片,属性文件和被引用的第三方包.

    jdk8u361 arm64 rpm包

    JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。没有JDK的话,无法编译Java程序(指java源码....

    jdk8u361 x86 rpm包

    JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。没有JDK的话,无法编译Java程序(指java源码....

    JAVA_API1.6文档(中文)

    javax.xml.bind 为包含解组、编组和验证功能的客户端应用程序提供运行时绑定框架。 javax.xml.bind.annotation 定义将 Java 程序元素定制成 XML 模式映射的注释。 javax.xml.bind.annotation.adapters XmlAdapter ...

    SamoApp:综合酒吧管理应用程序

    萨摩应用程式综合酒吧管理应用程序SamoApp是一款应用程序,旨在涵盖管理诸如酒吧或酒馆之类的机构的大部分方面。文献资料SamoApp尚未记录。 在代码中只有少数Javadocs注释,但是,此问题将很快得到解决。部署方式...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    带有肥皂客户端的其余端点:两个使用SOAP客户端的Spring Boot应用程序:一个MVC和一个WebFlux

    带有SOAP客户端的示例Spring Boot App 三个示例Spring Boot应用程序: ...生成并运行在每个目录中运行mvn package 在运行SOAP服务应用程序: java -jar target/soap-service-blz.jar 在运行MVC应用程序: java -jar ta

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    尽管现有的 EmployeeMgmt 应用程序已经有了 Façade 接口,但这个接口是暴露给 Servlet 使用的,最好能再为 Flex 定义另一个接口 FlexService,并隐藏 Java 语言的特定对象(如 清单 1 所示): 清单 1. Flex...

    ejm-java-servlet-hibernate-1:在 NetBeans 8.0.x 中详细阐述的项目,它包含一个 Web 应用程序的基本示例,该应用程序使用 MVC 模式通过 servlet 和 JSP 实现表(书籍)的 CRUD 功能。 Hibernate 4.3 用于访问数据库。 对于视图的设计,包含了 Bootstrap 3.3.2 框架

    在 NetBeans 8.0.x 中详细阐述的项目,它包含一个 Web 应用程序的基本示例,该应用程序使用 MVC 模式通过 servlet 和 JSP 实现表(书籍)的 CRUD 功能。 Hibernate 4.3 用于访问数据库。 对于视图的设计,包含了 ...

    JPackIt打包工具使用说明

    JPackIt可以把Java工程打包成一个可执行的包(如:jar,class或exe).包括所有Java应用程序资源如:代码,图片,属性文件和被引用的第三方包.本文详细的介绍了如何使用jpackit,

    rock.tsf.jar

    包rock.tsf的设计目标是为独立的应用服务提供了一个框架和运行环境。利用此包中提供的类,开发人员可以轻易的派生出实现不同应用的TCP Server。此包中包含4个最基础的类,Server,ManagerService,MonitorPool,...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    Java课程设计项目实例《基于微服务的在线签到》子系统.pdf

    2、微服务架构风格 (1)什么是微服务架构风格 微服务架构(Microservice Architecture)风格是一种将一个单一应用程序(单体程序) 开发为一组小型服务的方法,每个服务都运行在自己的进程中,服务间的通信完全...

Global site tag (gtag.js) - Google Analytics