Java| 命令行运行Java程序(Jar或Class)

在前面的文章中,我们已经知道如何使用javac来编译java文件和运行简单的单个class文件了,命令行编译Java程序以及运行class文件,本篇文章主要讲归纳讲解下通过命令行来运行java程序

命令行运行java程序的两种方式:
方式一:
直接使用java -jar yveshe.jar的方式来运行,这里在yveshe.jar中的项目清单文件MANIFEST.MF需要配置Main-Class属性值.
方式二:
Linux系统多个jar之间的分隔符号用:,Windows系统多个jar之间分隔符号用;,遵循java -cp xx.jar;xxxjar 主类 参数
java -cp .;c:\classes\myClass.jar;d:\classes\*.jar packname.mainclassname
EG:java -cp reference1.jar;reference2.jar com.yveshe.Test hello的方式运行jar.-cp后面默认是相对路径,也可以写扩展包的绝对路径.

注意: 选项-cp-classpath是没有区别的,主要是由于classpath太长了于是就提供了简写的选项.
注意:这里不建议大家通过命令java -cp指定了扩展类位置后有在单个jar中的MANIFEST.MF中配置.


如何使用命令行模式来运行jar文件?

这里首先需要介绍下jar文件到底是什么?

JAR文件(Java归档,英语:Java ARchive)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库.简单点理解其实就是一个压缩包.既然是压缩包那么我们为了提取JAR文件的内容,就可以使用任何标准的unzip解压缩软件,或者每个Java虚拟机都带有的jar命令jar -xf foo.jar来解压相应的jar文件来获取其中的内容.

在了解了jar文件的基本信息后,我们该如何运行它呢?

在java中我们使用命令行 java -jar cmd.jar来运行jar文件.

我们通过Eclipse的Export --> Runnable jar file 导出一个可以运行的cmd.jar文件然后执行既可.这时候我们就会想为什么是导出Runnable jar file 而不是普通的jar呢?主要是Eclipse在导出Runnable jar file的时候会自定生成一个MANIFEST.MF项目清单文件,并且会做一些配置.
如果我们直接运行一个普通的jar会提示xxx.jar中没有主清单属性也就是在MANIFEST.MF中没有配置Main-Class值.

一个简单的配置如下(注意Main-Class的值是包名.入口类):

Manifest-Version: 1.0
Class-Path: .
Main-Class: com.yveshe.PackageClass

上面说的是最简单的方式,也就是一个项目不依赖任何其他依赖包的时候,那么如果一个项目依赖了很多外部的jar包,如果不做特殊的处理肯定是会有java.lang.NoClassDefFoundError:异常的,那么我们该如何配置呢?
当有多个需要依赖的jar的时候,我们可以通过配置Class-Path来实现,当项目依赖多个外部的jar时可以空格分隔开配置在Class-Path中.

Manifest-Version: 1.0
Class-Path: . cmd_lib/commons-lang3-3.7.jar  
Main-Class: com.yveshe.PackageClass

这里简单介绍下常用的配置属性:

MailClass: 是程序启动类(包名.类名)
注意:可执行的JAR文件中的Manifest文件用代码Main-Class: myPrograms.MyClass指定了入口点类,注意要指明该类的路径(运行时的-cp参数将被忽略).有些操作系统我们可以在点击后直接运行可执行JAR文件。而更通用的的方式是通过命令行执行java -jar foo.jar

ClassPath:是配置搜索类文件的路径 可以配置的是jar和zip或者目录,可以在这里配置项目中需要的依赖jar地址.

Java常用命令:

java -cp或者java -classpath:

虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:
Bootstrap classes,Extension classes,User classes。
Bootstrap 中的路径是虚拟机自带的jar或zip文件,虚拟机首先搜索这些包文件,用System.getProperty(“sun.boot.class.path”)可得到虚拟机搜索的包名。
Extension是位于jre”lib”ext目录下的jar文件,虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件。用System. getProperty(“java.ext.dirs”)可得到虚拟机使用Extension搜索路径。

它告知虚拟机搜索目录名、jar文档名、zip文档名,之间用分号;分隔。
例如当你自己开发了公共类并包装成一个common.jar包,在使用 common.jar中的类时,就需要用-classpath common.jar 告诉虚拟机从common.jar中查找该类,否则虚拟机就会抛出java.lang.NoClassDefFoundError异常,表明未找到类定义。 在运行时可用System.getProperty(“java.class.path”)得到虚拟机查找类的路径。

User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath
思考: 这里是一最后搜索到的路径生效吗?(待确认)~~

关于搜索路径:(程序运行指定的classpath 和 配置的系统环境变量CLASSPATH)

使用-classpath后虚拟机将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则虚拟机使用当前路径(.)作为类搜索路径。
推荐使用-classpath来定义虚拟机要搜索的类路径,而不要使用环境变量 CLASSPATH的搜索路径,以减少多个项目同时使用CLASSPATH时存在的潜在冲突。例如应用1要使用a1.0.jar中的类G,应用2要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,虚拟机搜索到第一个包中的类G时就停止搜索,如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。

CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
.代表当前路径,环境变量中路径的分隔符号会根据操作系统的不同而不同,这里主要的区别可以查看我之前写的关于环境变量和系统属性的文章Java中获取系统属性和环境变量

要指定各个JAR文件具体的存放路径,相同路径有多个可使用通配符

如何通过Eclipse导出可直接运行的Jar包?

方式一:将项目中需要的依赖直接在该项目的Jar生成.
Export:

运行命令:

方式二:将项目依赖的jar归纳到一个子文件夹中,这里需要的注意的是如果是依赖的项目则该部分代码还是直接在本项目的jar中生成了.(建议在导出可执行jar时,将依赖的项目单独打包放入classpath)

参考:
java命令参数说明大全(偷来的):http://xinklabi.iteye.com/blog/837435

猜你喜欢

转载自blog.csdn.net/u011479200/article/details/80099476