cmd 命令行下 java class生成jar包java
进入dos操做符窗口web
cd进入要打成jar包的class文件全部文件夹目录windows
jar cvf [生成jar的名称.jar] [列出class文件] //如有多个,以空隔隔开tomcat
如:网络
一。操做零散的单个或几个class文件app
jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.classeclipse
二。把一个文件夹下面的全部class文件打成jar包webapp
jar cvf ibstool.jar * 回车编辑器
生成可执行jar包:ide
编译的class文件中必须有main入口函数的类方能生成可执行jar包,如:
public static void main(String[] args)
生成的方法步骤:
方法一:
1。用上面的方法把class与相应的结构目录打成jar包
2。解压这个jar包到当前目录
3。编辑META-INF/MANIFEST.MF,给jar包指定程序入口main函数,内容为:
Manifest-Version: 1.0
Created-By: 1.5.0_06 (Sun Microsystems Inc.)
Main-Class: MutiThread (回车)
(注意回车与空格,这个文件的内容排版必须标准)
4。再用winzip把这些文件压缩成jar格式包,或者压成zip包,再改后缀名为jar也可。
方法二(推荐):
2. 打成可执行的jar包
cmd操做窗体中进入class文件的根目录,之因此说根目录,是由于下面其下面还能够有不少文件包(夹);
在此目录准备好一个manifest.mf文件,其内容为:
Manifest-Version: 1.0
Created-By: 1.5.0_06 (Sun Microsystems Inc.)
Main-Class: MainEntry
main-class为指定全部类的main方法所在的类名.
最后用命令: jar cvfm jarname.jar manifest.mf *
3.测试可执行jar包.
用命令:java -jar jarname.jar
4.为可执行jar包制做bat文件.
例如 :
@echo off
rem
rem Set BQ_IBS_HOME before running this script.
rem
if not "%BQ_IBS_HOME%" == "" goto CONT0
set BQ_IBS_HOME=c:\ibs
:CONT0
@echo on
java -DBQ_IBS_HOME=%BQ_IBS_HOME% -jar jarname.jar
:END
网络引用:
java jar命令
好比您的class包存放路径为 d:\com\demo (demo是个目录,下面含有子文件夹及class文件)
具体操做以下:
一、打开dos窗口,进入demo目录
cd d:\com\demo
二、执行 jar cvf demo.jar * 回车
三、在demo目录下面你会发现demo.jar
具体参数请看下面的解释:
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 建立新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或全部的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用zip压缩格式
-M 不产生全部项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,而且包含下列文件:
若是一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都须要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的全部文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
来个小例子试试看:
咱们只有一个HelloWorld,以下:
public class HelloWorld{
public static void main(String[ ] args){
System.out.println(“Hi, Hello World!”);
}
}
将这个java文件存到C盘跟目录下,ok,接下来,
在先前打开的命令提示符下(跳转到C盘提示符下),咱们输入javac HelloWorld.java,而后继续输入:jar cvf hello.jar HelloWorld.class,回车后去你的C盘看看,多了什么,没错 hello.jar 。
基本的步骤咱们如今都知道了,你能够本身去尝试一下随着jar后面的参数的不一样,结果有什么变化。
紧接着咱们看看如何运行咱们的jar包。
在进入正题以前,你要先打开咱们刚刚作好的jar包看看,多了什么呢,META-INF目录?再看看里面是什么,还有一个MANIFEST.MF文件是否是?用文本编辑器(我这里是UltraEdit)打开它看看:
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
就是这样。这里咱们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是咱们以前写的那个类,也就是咱们的入口类。也即,
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
Main-Class: HelloWorld
接下来,咱们在命令提示符里执行:
jar umf MANIFEST.MF app.jar (应该是hello.jar吧)
这样咱们使用了咱们本身的MANIFEST.MF文件对原来默认的进行了更新。你不妨能够再进去看看是否是添上了Main-Class: HelloWorld这一句。 (是吗,我怎么没试出来,提示java.io.FileNotFoundException:MANIFEST.MF(系统找不到指定的文件)怎么回事?)
Ok,这个最后的一步了,来验证咱们作的一切,在命令提示符中输入:
java -jar hello.jar(执行)
出现了什么, Hi, Hello World!
咱们再来看看jar文件在tomcat中发布,注意:在tomcat中咱们就不能再用jar这种格式,而改war格式,它是专门用于web应用的,其实整个过程下来基本上和jar是相似的:
先准备咱们要打包的资源。
找到存放tomcat的webapps目录,进到其中,新建一个文件夹,这里命名为hello,再进去新建WEB-INF文件夹,再进去新建classes文件夹,此时咱们也将咱们惟一的servlet,HelloWorld.java放到这里,在与classes目录同级下创建一文件web.xml。Ok,目前咱们初步创建了一个简单的web应用。
关于 MANIFEST.MF 写法.
例如咱们打包的jar为 Test.jar
Manifest-Version: 1.0
Main-Class: windows.VideoWindow
Class-Path: lib\org.eclipse.swt_3.3.0.v3346.jar lib\org.eclipse.swt.win32.win32.x86_3.3.0.v3346.jar
上面为打包为jar中的包说明文件. 下面这个报错一直出现.
could not find main class. Program will exit
这个错误提示其实不是没有发现main class. 而是jar若是有错误执行不了,就会出现这个错误. 打包完成后, 要先运行 cmd -> java -jar your.jar 确认没有问题便可执行jar. 使用-jar参数后, 系统的Classpath 变量再也不起做用. 虚拟机将去MANIFEST.MF中的Class-Path 下找相关的包.
而后才能成功的从: windows.VideoWindow 的main方法进入. 不然没有相关链接包,则会提示找不到main class. 而你们可能还迷糊的找不到北. 明明有main class吗.
若是这个写的不对. 则就会一直报错.
看看上面这个Class-Path: 后面的写法. 空格分开. 绝对不能有分号.切记.
最后必须有换行. 这个也是要注意的. 不然依然提示没有mainclass.
不要由于这个小事情耽误了时间. 其中 lib/ 表示这个jar必须在打包Test.jar所在目录的一个lib子目录中.
运行jar须要命令: java -jar Test.jar
双击也能够, 则使用 javaw 打开.
关于java -classpath a.jar;b.jar; class test.Test 执行时. a.jar;b.jar; 后面都必须有分号. 不然报错. 不要期望不写classpath让系统本身找. 这不是在eclipse里面.必须写上你要使用的类. 不然总会提示您编译出错.
能够用的上的有:
1. Main-Class 指定程序的入口,这样能够直接用java -jar xxx.jar来运行程序。
2. Class-Path 指定jar包的依赖关系,class loader会依据这个路径来搜索class。
我平时用mf文件通常说来都是让jar成为能够直接运行这一目的。虽然目的这么简单,可是每次打包仍是很容易出现各类各样的问题让人头痛。mf老是没有被应用,或者是出错了。
首先给出一个简单而标准的例子:
Manifest-Version: 1.0
Main-Class: ui.JFrameMain
Class-Path: jtds-1.2.jar c3p0-0.9.1.2.jar
esri_mo20.jar esri_mo20res.jar jsde83_sdk.jar
解释一下:
Manifest-Version mf文件版本号,这行照抄
Main-Class 包含main函数的类,程序的入口
Class-Path 用到的一些包
分析一下要点:
要点1:每行的“:”(冒号)用来分隔键值对。冒号后边必定要跟一个空格!!!
也就是说务必写为:
Main-Class:(空格)YouClassName
Class-Path:(空格)Class1.Jar
不然JBuilder会报("Manifest.mf": Error reading manifest: java.io.IOException: invalid header field
)这样的错。再也不IDE帮助下作的JAR会发现MF没有起到应有的做用。顺便说一下之前我看到JBuilder报另外一个个错大概说是什么换行符不对,好像也是因为这个问题引起的。原先总觉得是windows里边的回车是由回车,换行2个字符构成而形成的。如今看来好像不是这样,是由于少了冒号后边那个空格。
要点2:Class-Path里边的内容用空格分隔而不是逗号或者分号。(唉。。。我老是下意识的用分号)
也就是说务必写成:
Class-Path:(空格)Class1.jar(空格)Class2.jar(空格)Class3.Jar
要点3:有的文章说MF文件每行不能超过七十多的字符,个人经验是若是在JBuilder里编辑MF超过了也无妨,通常我是尽可能一行写完。续行挺麻烦又要以空格开头什么的。我也常常直接用winRar打开jar而后直接编辑里边的mf文件,这是个好方法,很直接了当,缺点就是若是改坏了也不会报错,只是MF有的部分失效了,好像运行时也会说"错误的MF文件版本"。
介绍几个技巧:
技巧1:使用winRar打开jar,双击MF文件,就能够编辑了,编辑完了Ctrl+S保存。特方便。也能够在外边写好一个Manifest.mf,而后直接拖入覆盖之前的。
技巧2:写一个run.bat来运行你的jar。run.bat大致内容以下:
java -jar yours.jar
pause
后边加一个pause就可让你看到具体哪里出错了,通常来讲问题若是出在MF上,那么每每就是哪一个包,哪一个类没有找到的NoClassDef这种异常。