命令行执行class文件和jar文件

一.命令行执行class文件

在d:/test/lib目录下,有一个Mains.java文件

使用命令javac编译,执行成功:

D:\test\lib>javac Mains.java

 此时使用java命名行运行编译后的class文件,则报NoClassDefFoundError错误:

D:\test\lib>java Mains  
Exception in thread "main" java.lang.NoClassDefFoundError: Mains  
Caused by: java.lang.ClassNotFoundException: Mains  
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)  
        at java.security.AccessController.doPrivileged(Native Method)  
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)  
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)  
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)  
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)  
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 

 出现该异常,是因为环境变量不正确,将命令改为:

D:\test\lib>java -cp . Mains 

 则运行成功。

然后修改Mains.java源文件,在其中增加包说明:

package com.zhendao

 重新编译后,使用java -cp . Mains命令,执行失败。原因是名称错误,JVM运行class时,会检查包定义路径下是否有与类名相同的文件。因此这次需要将class文件放在 com/zhendao目录下。即:D:/test/lib/com/zhendao/Mains.class

然后在lib目录下重新运行:

D:\test\lib>java -cp . com/zhendao/Mains

二.命令行执行jar文件

命令行执行jar文件与执行class文件类似。不过有几个问题要注意一下:

1.如果使用eclipse打jar包,一定要设置Main Class:



 设置Main Class目的在于,运行jar包时,才能找到程序执行的入口。设置后,可在jar中(使用解压工具打开)有一个名META-INF的目录,该目录下有一个名为MANIFEST.MF的文件,其内容如下:

Manifest-Version: 1.0  
Main-Class: com.zhendao.Main 

 如果在打jar时没有设置Main Class,则该文件中没有Main-Class:com.zhendao.Main信息。

2.如果被执行的jar包还需要依赖其他第三方jar例如日志jar包或者数据库驱动jar包时,则需要手工修改上述的MANIFEST.MF文件,在其中增加Class-Path配置:

Class-Path: log4j-1.2.14.jar ojdbc14.jar  

 注意:多个jar之间使用空格分隔开。

然后使用命令执行jar包:

D:\test\lib>java -jar nr_daybar.jar  

 (其中的nr_daybar.jar是笔者打的示例jar包的名字)

另外,在网上查找资料时,看见有其他人并没有在MANIFEST.MF设置Class-Path,而是在执行java运行命令前,设置了环境变量

猜你喜欢

转载自1876540.iteye.com/blog/2218526