`

<转>java如何打jar包

阅读更多

进入dos操作符窗口

cd进入要打成jar包的class文件所有文件夹目录

jar cvf [生成jar的名称.jar] [列出class文件] //若有多个,以空隔隔开

如:

一。操作零散的单个或几个class文件

jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class

 

二。把一个文件夹下面的所有class文件打成jar包

jar cvf ibstool.jar * 回车

 

生成可执行jar包:

编译的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文件)

具体操作如下:

1、打开dos窗口,进入demo目录

cd d:\com\demo

2、执行 jar cvf demo.jar * 回车

3、在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这种异常。

分享到:
评论

相关推荐

    Java打Jar包方法和实例

    Java打Jar包是Java开发过程中常见的一项操作,它将多个类文件、资源文件等打包成一个可执行的JAR(Java Archive)文件,方便分发、部署和运行。本篇文章将详细阐述Java打Jar包的方法,并通过实例进行演示。 1. **...

    java-html2image-master.zip

    &lt;groupId&gt;gui.ava&lt;/groupId&gt; &lt;artifactId&gt;html2image&lt;/artifactId&gt; &lt;version&gt;0.9&lt;/version&gt; &lt;/dependency&gt; &lt;repositories&gt; &lt;repository&gt; &lt;id&gt;yoava&lt;/id&gt; &lt;name&gt;AOL yoava&lt;/name&gt; &lt;url&gt;...

    java-ipfs-api.jar包1.3.3版本,可用于ipfs上传 ->java调用IPFS去中心化体系

    &lt;artifactId&gt;java-ipfs-api&lt;/artifactId&gt; &lt;version&gt;1.3.3&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; 创建节点 IPFS ipfs = new IPFS(new MultiAddress("/ip4/127.0.0.1/tcp/8888")); 初始化IPFS 加载 ipfs....

    将jar包添加到本地maven仓库

    有时,我们可能会遇到一些不常见的库或者自定义的jar包,这些库并未在Maven中央仓库中提供,这时就需要将这些jar包手动添加到本地Maven仓库,以便在项目中引用。以下是一个详细的步骤指南,教你如何完成这一过程。 ...

    jstl el taglib 完整jar包

     在web应用程序中,添加以下JAR包到/web-inf/lib目录: - taglibs-standard-spec-1.2.5.jar - taglibs-standard-impl-1.2.5.jar - taglibs-standard-jstlel-1.2.5.jar - xalan-2.7.1.jar - serializer-2.7.1.jar...

    Java+IDEA+maven混淆打包

    配置中的`&lt;option&gt;`标签用于指定需要保留的类或方法,`&lt;obfuscate&gt;true&lt;/obfuscate&gt;`开启混淆,`&lt;injar&gt;`和`&lt;outjar&gt;`分别定义输入和输出的jar文件路径。 3. **执行打包**: 在IDEA中,可以通过点击“Maven”面板...

    protobuf文件打包成jar包

    7. **使用jar包**:生成的jar包可以被其他Java项目引用,只需将它添加到项目的类路径中。你可以使用`&lt;dependency&gt;`标签(Maven)或`implementation`(Gradle)来引入这个jar。 通过以上步骤,你成功地将protobuf...

    springboot+maven打包demo【将依赖与配置文件打包到jar包外部】

    在本文中,我们将深入探讨如何使用Spring Boot和Maven来构建一个项目,使得依赖和配置文件被打包到jar包外部,以实现更加灵活的项目管理。这个方法对于那些需要根据不同环境进行定制配置或者频繁更新配置的应用来说...

    java打包jar、第三方jar包、制作成.bat批处理

    5. **打jar包.docx** 这可能是文档形式的指南,详细介绍了如何进行Java项目的打包过程,包括可能遇到的问题和解决方案。 总结来说,打包Java项目涉及到配置构建工具,处理依赖库,创建执行脚本,以及编写或使用...

    Maven引入本地Jar包并打包进War包中的方法

    但是,在打包时,由于scope=system,默认并不会将Jar包打进war包中。所有我们需要通过插件进行打包。我们可以在pom.xml文件中添加以下配置,以便将本地Jar包打包进War包中: ``` &lt;plugin&gt; &lt;groupId&gt;org.apache....

    Java基础教程教学ppt

    《包和JAR》 ppt加练习 &lt;br&gt;Java基础教程第十单元《继承》ppt和例程 &lt;br&gt;Java基础教程第九单元管理继承 &lt;br&gt;Java基础教程第八单元《类设计》+例程包(Version1) &lt;br&gt;Java基础教程第七单元《数字和数组》+例程包 &lt;br&gt;...

    java集成kettle相关jar包

    在Java项目中使用Kettle时,通常需要将Kettle的相关库(jar包)引入到项目的构建路径中。然而,有时我们可能无法直接从Maven仓库获取这些依赖,这时就需要手动处理。 首先,让我们来看看`pom.xml`文件的作用。在...

    java中json格式转化所需jar包

    在标题中提到的“java中json格式转化所需jar包”,可能指的是Jackson库的相关jar包,例如`jackson-databind.jar`,这个包包含了基本的JSON绑定功能,允许我们将Java对象序列化为JSON和反序列化回Java对象。...

    maven打包 maven打jar包详细步骤

    &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt; &lt;version&gt;3.2.0&lt;/version&gt; &lt;configuration&gt; &lt;archive&gt; &lt;manifest&gt; &lt;addClasspath&gt;true&lt;/addClasspath&gt; &lt;mainClass&gt;com.example.MainClass&lt;/mainClass&gt; &lt;/...

    maven打可执行JAR包

    在本文中,我们将详细讨论如何使用Maven来创建可执行的JAR包,使得通过`java -jar`命令可以直接运行。我们提供两种方法来实现这个目标。 ### 方法一:使用`maven-assembly-plugin` 1. **集成插件**:在`pom.xml`...

    java中html转word方法以及用到的jar包

    在本文中,我们将深入探讨如何在Java中实现这一功能,以及需要用到的关键库和jar包。 首先,你需要引入一个能够处理HTML与Word转换的库。一个常用的库是Apache POI,它是一个用于读写Microsoft Office格式文件的...

    java转json的jar包

    在给定的“java转json的jar包”压缩文件中,可能包含了这些库的JAR文件,如Jackson、Gson或org.json的JAR。将这些JAR添加到项目的类路径中,就可以在没有Maven或Gradle的情况下使用这些库进行JSON转换了。在没有IDE...

    JavaCV两个必须jar包:javacpp-1.4.1.jar和javacv-platform-1.4.1.jar

    在JavaCV项目中,有两个非常重要的JAR包:`javacpp-1.4.1.jar`和`javacv-platform-1.4.1.jar`。 `javacpp-1.4.1.jar`是JavaCPP库的核心组件,它的主要作用是为Java程序员提供一个桥梁,使得他们可以直接调用C++库的...

    Java项目后台打包jar包执行报错“没有主清单属性”

    2. 在`&lt;project&gt;`标签内部,添加或检查`&lt;packaging&gt;`标签,确保其值设置为`jar`,表示我们要创建一个标准的Java应用jar包: ```xml &lt;packaging&gt;jar&lt;/packaging&gt; ``` 3. 添加`&lt;url&gt;`标签,虽然这不是解决"没有主...

    钉钉sdk-dependency-maven

    钉钉sdk-dependency-maven ... &lt;dependency&gt; &lt;groupId&gt;DingTalk&lt;/groupId&gt; &lt;artifactId&gt;open-sdk&lt;/artifactId&gt; &lt;version&gt;1.0.0&lt;/...钉钉的无官方 &lt;dependency&gt; ,使用maven命令将jar打包成maven形式的&lt;dependency&gt;

Global site tag (gtag.js) - Google Analytics