`

[转载]java命令执行jar包的方式

    博客分类:
  • java
阅读更多
原文地址:java命令执行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://cuixiaodong214.blog.163.com/blog/static/951639820099135859761



总结:

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

相关推荐

    zookeeper客户端jar包ZooInspector.jar 以及运行命令

    start cmd /k "cd/d D:\root\aplication\installpath\ZooInspector\build && java -jar zookeeper-dev-ZooInspector.jar &&taskkill /f /t /im cmd.exe" ———————————————— 版权声明:本文为CSDN...

    jdk常用命令

    12. **jcmd**:Java命令工具,用于在JDK 1.7及更高版本中执行诊断操作。 13. **jrunscript**:运行JavaScript或其他支持的脚本语言,利用Java平台的功能。 14. **keytool**:管理密钥和证书,用于创建和管理...

    Derby 命令(转载)

    java -cp $DERBY_HOME/lib/derbytools.jar org.apache.derby.tools.ij ``` 在`ij`环境中,你可以创建数据库、连接到现有的数据库、执行DDL(数据定义语言)和DML(数据操纵语言)语句,如CREATE DATABASE、SELECT、...

    shell 管理SpringBoot 生产环境服务-转载

    `start.sh`可能包含执行`java -jar yourapp.jar`命令来启动服务的逻辑,而`stop.sh`可能通过发送信号(如SIGINT或SIGTERM)来停止进程。`start_B.sh`和`stop_B.sh`可能是备用脚本,或者包含了一些额外的功能或优化,...

    jdbc连接数据库的方式2

     调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时...

    身份证照片自动识别java源码-golangman:golangman是一个帮助具有其他语言开发经验的人快速上手golang的开源项目

    golang的包类似java的jar、c++的lib.golang的包管理类似nodejs的npm、java的maven、c#的nuget. 除了系统自带的一些包,其他包均需要下载. 安装IDE 个人喜好,因为我很喜欢WebStorm开发js,所以安装了WebStorm的go插件,...

    apk反编译得到源代码

    2.打开命令窗口 (开始 > 运行,输入cmd,回车。)进入到apktool.bat的文件夹里。 输入:apktool d C:***.apk C:***文件夹 (命令行解释:apktool d 要反编译的文件 输出文件夹) 特别注意:你要反编译的文件一定要...

    反编译apk文件工具及使用方法

    2.打开命令窗口 (开始 > 运行,输入cmd,回车。)进入到apktool.bat的文件夹里。 输入: apktool d C:\***.apk C:\***文件夹 (命令行解释:apktool d 要反编译的文件 输出文件夹) 特别注意:你要反编译的...

    hsqldb使用(转载)

    例如,启动名为`test`的数据库,命令为`java -cp hsqldb.jar org.hsqldb.Server -database.0 ./db/test -dbname.0 test`。通过JDBC,我们可以使用`jdbc:hsqldb:hsql://localhost:9002/test`连接到服务器。 - **In-...

    pay5160:https的转载者

    构建成功后,通常会在项目目录下的`target`或`build`目录找到可执行的WAR或JAR文件。 对于一个涉及HTTPS的Java Web应用,可能需要配置服务器证书,例如在Tomcat服务器中,这通常涉及修改`server.xml`文件中的`...

    APKTool批处理版l

    4.Win+R 运行CMD,用cd命令转到apktool-install-windows所在文件夹,输入apktool看看。会列出一些帮助的话就成功了。Apktool 命令 apktool d XXX.apk ABC 反编译XXX.apk到文件夹ABC apktool b ABC 从文件夹ABC重建...

Global site tag (gtag.js) - Google Analytics