`
xinklabi
  • 浏览: 1560142 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题)

    博客分类:
  • Java
 
阅读更多

java命令执行jar包的方式

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

 

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

 

比如有个叫做test.jarjar包,里面有一个拥有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://cuixiaodong214.blog.163.com/blog/static/951639820099135859761

 

总结:

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

 

 

---------------------------------------------------------------------------------------------------------

 

如果单个jar文件,没有引用到其他jar文件,而且指定了Main-Class,可以这样运行:
    java -jar hello.jar
如果执行的jar文件引用了其他jar文件,该怎么办?
这里hello.jar里面用到Log4j的Log
    java -cp log4j-1.2.14.jar -jar hello.jar
这个想当然可以执行,实际上执行会出现ClassNotFoundException的
因为使用了 -jar 选项,环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略

正确运行方式如下:
    1、
    java -cp lib\log4j-1.2.14.jar;hello.jar com.dhn.Hello    (com.dhn.Hello为主类)
    在windows下多个jar之间以分号(;)隔开,最后还需要指定运行jar文件中的完整的主类名
    2、
    java -jar hello.jar
    但是需要修改hello.jar中的MANIFEST.MF,通过MANIFEST.MF中的Class-Path 来指定运行时需要用到的其他jar,
    其他jar可以是当前路径也可以是当前路径下的子目录。多个jar文件之间以空格隔开
    以下面的MANIFEST.MF文件为例
    Manifest-Version: 1.0
    Main-Class: com.ibm.portalnews.entrance.Main
    Class-Path: lib\commons-collections-3.2.jar lib\commons-configuration-1.5.jar lib\commons-lang-2.3.jar lib\commons-logging.jar lib\dom4j-1.6.1.jar lib\jaxen-1.1-beta-7.jar lib\jdom.jar lib\log4j-1.2.14.jar

    其中Manifest-Version表示版本号,一般由IDE工具(如eclipse)自动生成
    Main-Class 是jar文件的主类,程序的入口
    Class-Path 指定需要的jar,多个jar必须要在一行上,多个jar之间以空格隔开,如果引用的jar在当前目录的子目录下,windows下使用\来分割,linux下用/分割
    文件的冒号后面必须要空一个空格,否则会出错
    文件的最后一行必须是一个回车换行符,否则也会出错

分享到:
评论
1 楼 u012236967 2017-03-15  
 

相关推荐

    bat 运行java main方法

    源代码,jar包及bat文件,注意:bat文件中不能有空格。

    浅谈java 执行jar包中的main方法

    下面小编就为大家带来一篇浅谈java 执行jar包中的main方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    打包jar的运行

    java的jar运行

    ARMA模型与ARIMA模型java实现例程

    ARMA、ARIMA、AR、MA均是时间序列的重要方法。此例程中包含了以上所有的实现过程,java实现的,且含有main函数供自行调试,已亲测可用!

    java实现解压压缩包的jar包和源码.zip

    java实现解压压缩包的jar包和源码,主要针对格式有7z,rar,zip,附带一个日志打印以及其他的几个文件操作的小功能。路径配置在FileHelper.java类的main函数中,可以封装到配置文件中去。

    allatori-8.2-完美版.jar

    4.修改混淆完后的jar包内的注释信息 相关链接: allatori-8.2完美版.jar https://download.csdn.net/download/bjw211/85533609 allatori-8.1完美版.jar https://download.csdn.net/download/bjw211/83224814 ...

    java转exe class转exe jar转exe工具

    本人亲测,简体中文破解,绝对简单好用,可将jar包或java转成可直接运行的java程序,支持图标,传上来做个备份以防丢失。 使用教程(共六步,傻瓜式): 下载并解压后打开目录,找到主程序j2ewiz.exe并双击运行 1....

    Python调用jar包方法实现过程解析

    需求 最近在后台项目代码中一段自定义的AES加解密...修改main函数打jar包 在intellij中打jar包: 1. File–> Project Structure… –> Artifacts –> + –> JAR –> From modules with dependencies –> OK –> 勾选

    Eclipse项目自动打jar包

    Eclipse_项目打包_jar 指定main函数自动打包插件

    junit.jar 单元测试JAR包

    JUNIT用来作单元测试,非常方便,不需要再写main函数来测试了,直接写个注解就可以对相应的方法进行测试

    IDEA打包jar-解决找不到或无法加载主类 main的问题

    主要介绍了IDEA打包jar-解决找不到或无法加载主类 main的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    zip4j-1.3.2.jar包和使用范例.zip

    java项目中压缩解压jar包,附工具类代码,及测试main函数。

    JAVA打包专用工具

    其中Font2DTest为你自己的类中含有main函数的类的名字 如果有包名,应该带上包的名字 如test.Font2DTest 注意:在Main-Class:后面一定要有一个空格.再加上Font2DTest. 修改完之后.FILE-EXIT就可以了 *******...

    java 解析 excel 程序

    Java使用poi的jar包解析excel,里面有个ExcelUtil工具类, 非常实用,里面有main函数可以测试,导入到eclipse里面就可以运行, 有测试excel文件,需要的jar都在里面, 导入就可以运行.

    java 蜘蛛纸牌源代码以及可运行的jar包

    public static void main(String[] args){ Spider spider = new Spider(); spider.setVisible(true); } /** **构造函数 */ public Spider(){ setTitle("蜘蛛牌"); setDefaultCloseOperation(javax....

    Excel数据操纵-jar包-jxl.jar

    最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。  搭建环境  将下载后的...

    java课程设计界面美化包,swing也可以这么漂亮

    使用了第三方的substance.jar这个包,这只是个demo,演示如何使用这个包,想要更改皮肤,请参见main函数中的注释,里面有我写的教程。话说,上传个资源,非要写够20字。。

    利用jxl读取Excel代码的完整内容,包括jar包

    利用jxl读取Excel代码的完整内容,包括jar包。包括测试用例,下载后放到eclipse中即可运行,运行主类JHUserImportMgr的main函数即可看到效果。

    Java版socket编程实现带语音聊天和文件传送功能

    资源内容包括源程序和打包后的可执行jar文件,以及要用到的所有jar包; 代码保证可用,如有问题请留言,代码较规范,结构清晰,相信对学习java socket编程和swing界面开发的朋友有一定的帮助。 注:main函数在...

    ajar:带有指定 .java 文件的自动后门 .jar 文件

    文件 ajar.py -b <backdoor> -t <target> [-o ] ... 如果后门是一个持久性函数(例如侦听套接字的外壳程序),请确保将其分离到它自己的线程中,否则主应用程序将永远不会执行。 工具假定 javac 在您的路径中,您可以

Global site tag (gtag.js) - Google Analytics