大家都知道一个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加载前加载,注意使用,和系统类冲突就不好了.
方法二、使用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
总结:
以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。
相关推荐
关于执行java命令引入外部jar包方法
本文通过四种方法给大家介绍java命令执行jar包的方式,每种方法通过实例代码给大家详解,需要的朋友参考下吧
java打包成jar有多种方法,有jar命令,有eclipse有相关操作,有制作完成的jar文件就是可执行的,文件有详细操作步骤
windows运行jar包指定jdk路径的脚本文件。可以不用系统的jdk运行,指定某个文件下的jdk运行jar包
命令执行后会在temp目录下生成一个test.jar 文件双击此文件即可执行 注意:此时生成的jar文件只能在装配好Java虚拟机的PC才能正常使用 更好的方法是通过MyEclipse的net.sf.fjep.fatjar_0.0.31.jar插件进行自动生成。...
java通过代码登录远程linux服务器并执行linux命令源码以及jar包
windows 系统下启动与结束java的jar包的脚本(包括如何设置进程名称)
使用jcraft jar包登录linux系统,并读取执行shell命令结果,含jcraft jar包和java实例代码。
可执行JAR包及JAR命令详解 可执行JAR包及JAR命令详解 可执行JAR包及JAR命令详解
从一个完整的javaweb项目中复制的全部jar包
通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件...
通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件...
@echo off start "api-gateway网关" /D "D:\jianguan\houduan\yssjar-201902242125" java -Xmx1024M -Xms128M -jar api-gateway-1.0-SNAPSHOT.jar & .../D 后面的是jar包所在路径,后边的就是jar包运行命令了
教你怎样把class文件打成jar包--用java命令打包
NULL 博文链接:https://747017186.iteye.com/blog/2299559
dos命令测试java jar文件 命令行下运行JUnit测试 命令运行java
ikvm命令,Java编写的jar包用ikvm命令生成dll动态库,可以跨语言使用
java中生成exe文件 jar打包成可执行文件 内附使用文档
下面小编就为大家带来一篇运行jar程序时添加vm参数的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件...