1)接着上篇博客继续说手动编译之后,将代码打成jar包,然后直接“java -jar lz.jar"运行不成功的问题。还是先上代码:
这个是Demo类:
packageorg.lz.demo.a ;public classDemo{publicString getContent(){return "oh,yeah,done!";
}
};
接下来,这个是调用了Demo类的ImportDemo类,并且这两个类不在一个包中:
package org.lz.demo.b ; //定义一个包
importorg.lz.demo.a.Demo;public classImportDemo{public static voidmain(String args[]){
System.out.println(newDemo().getContent());
}
};
jar -cvf lz.jar org
生成lz.jar包。
java -jar lz.jar
提示如下:
这是因为jar包中的META-INF\MANIFEST.MF中没有添加Main-Class属性(Main-Class:之后紧跟一个空格,然后再输入(org.lz.demo.b.ImportDemo
),也就是主类,添加之后此文件内容是:
Manifest-Version: 1.0Created-By: 1.8.0_60 (Oracle Corporation)
Main-Class: org.lz.demo.b.ImportDemo
然后使用这个清单文件,重新生成jar包,将修改后的MANIFEST.MF拷贝,与org在同一个目录下,然后使用如下命令重新生成jar包:
jar cfm lz.jar MANIFEST.MF org( jar cfm [jar 文件名] [附加清单文件名] [导入文件])
然后,再执行:
java -jar lz.jar;
程序成功运行。截图如下:
2)但是,如果Demo类和ImportDemo类都引用了第三方的jar包,再按照这个方法就会提示找不到所引用的第三方库,这就是classloader没有加载成功的原因,具体提示如下:
解决方法,同样是修改MANIFEST.MF清单文件的内容,添加“Class-Path”属性。添加后的内容如下:
Manifest-Version: 1.0Created-By: 1.8.0_60 (Oracle Corporation)
Main-Class: lz.src.gauss.gauss
Class-Path: lib\jmatio.jar lib\jblas-1.2.4.jar
嗯嗯,将引用的两个库的相对路径作为“Class-Path”的值(:号紧跟一个空格)如果有多个引用库,彼此以空格隔开。然后再使用这个清单文件重新生成jar包
jar cfm lzSRC.jar MANIFEST.MF lz
然后 java-jar lzSRC.jar
程序成功运行,如下所示: