`
610622106
  • 浏览: 12748 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

 
阅读更多
【原文地址】http://longdick.iteye.com/blog/332580

大家都知道一个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


总结:

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

相关推荐

    生成JAR包的方法(打包后运行好像不快)

    - **标题**:“生成JAR包的方法(打包后运行好像不快)”:该标题指出文章将介绍如何生成Java应用程序的JAR包,并提到打包后的程序运行速度较慢的问题。 #### 描述解读: - **描述**:“在练习做orcl数据库比对工具时...

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

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

    idea将Java项目打包Jar包生成exe应用程序.docx

    在IT行业中,将Java项目打包成可执行的jar或exe文件是常见的需求,特别是对于希望在没有Java环境的用户机器上运行的应用程序。本篇主要介绍如何使用IntelliJ IDEA(Idea)将Springboot或Java项目打包为jar,并通过...

    【绝对可行,解决404】jfinal项目打包成jar在控制台运行方法

    在IT行业中,开发Java应用程序时,常常需要将项目打包成可执行的JAR(Java Archive)文件,以便在没有开发环境的机器上运行。对于基于JFinal的Web应用,这个过程可能会遇到一些挑战,因为JFinal是轻量级的Java Web...

    可运行项目打包jar到exe应用程序

    "可运行项目打包jar到exe应用程序" 本文将指导您一步一步地将Java项目打包成exe应用程序,并且无需考虑JDK环境问题,因为我们将JRE打包进去。这样,用户可以轻松地点击运行Java应用程序,不需要再担心JDK环境问题。...

    jar包1jar包1jar包1jar包1jar包1

    【描述】: "jar包1jar包1jar包1jar包1jar包1jar包1jar包1" 这段描述可能是在描述JAR文件在项目开发中的频繁应用,或者可能是在指出一个特定的JAR文件——"jar包1"在系统中扮演的关键角色。JAR文件通常包含运行Java...

    springmvc独立运行所需jar包

    要使 Spring MVC 能够独立运行,你需要一组特定的 JAR 包来提供核心功能、依赖管理和其他支持。以下是这些关键 JAR 包的作用和相关知识点: 1. **Spring Framework**: 这是 Spring MVC 的基础,包括 spring-context...

    jar包jar包jar包jar包jar包

    JAR文件在Java应用程序和库中扮演着重要角色,它不仅包含了Java字节码,还可能包含诸如图标、配置文件等其他资源。通过压缩,JAR文件可以减小文件大小,提高传输效率。JAR文件也可以用作Java应用程序的容器,支持可...

    从网页Web上调用本地应用程序(.jar、.exe)的主流处理方法

    "从网页Web上调用本地应用程序(.jar、.exe)的主流处理方法" 在做 web 应用的时候,我们经常会遇到在 web 中调用本地应用程序的问题,例如在 web 中点击一个按钮,然后打开自己写的或者别人的应用程序。这种方法可以...

    可以直接运行java jar Demo

    标题中的“可以直接运行java jar Demo”意味着这是一个Java应用程序的可执行jar文件,通常用命令`java -jar Demo.jar`即可在支持Java的环境中运行。这个Demo不仅包含了编译后的Java类,还可能包括了源代码,以便用户...

    JAVA打包成可运行的JAR程序

    JAVA打包成可运行的JAR程序 在 Java 开发中,为了方便程序的部署和分发,通常需要将程序打包成可执行的 JAR 文件。在这个过程中,需要注意几个重要的步骤,包括将依赖的 lib 包和配置文件正确地配置,生成 Class-...

    java调用Kettle引用jar包.zip

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

    struts2所有jar包程序文件

    本资源包含"struts2所有jar包程序文件",是开发者进行Struts2应用开发不可或缺的组件集合。 在Java Web开发中,jar(Java Archive)文件是一种归档格式,用于打包多个类文件和相关的元数据。Struts2框架的jar包通常...

    Jar包Jar包Jar包Jar包

    Java Archive (JAR) 文件是...总的来说,JAR包是Java生态系统中不可或缺的一部分,它们承载了代码、资源和项目依赖,是开发、部署和分享Java应用程序的关键。正确理解和使用JAR文件对于任何Java开发者来说都至关重要。

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

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

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

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

    Linux 运行jar包的几种方式

    在Linux系统中,运行Java应用程序通常涉及到jar包的执行。本文将详细介绍在Linux环境下运行jar包的多种方式,以及相关的命令格式和原理。 首先,最常见的命令是`java -jar xxx.jar`,这种方式使得SSH终端被锁定,...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件

    本文将详细介绍如何在Eclipse中将项目打包成JAR文件,并确保能正确引用外部JAR包和读取外部配置文件。 首先,我们来看如何打包项目为JAR。在Eclipse中,选择`Export` -> `Java` -> `Runnable JAR file`。在弹出的...

    jar包2jar包2jar包2jar包2jar包2

    标题中的“jar包2jar包2jar包2jar包2jar包2”可能是在强调jar包的重要性或者表示这是一个关于处理多个jar包的问题。描述中的重复同样表明了与jar包相关的主题,但没有提供具体细节,可能是涉及到jar包的合并、打包、...

    windows运行jar包指定jdk路径

    windows运行jar包指定jdk路径的脚本文件。可以不用系统的jdk运行,指定某个文件下的jdk运行jar包

Global site tag (gtag.js) - Google Analytics