最近研究了如何在java工程打包,期间遇到的一些问题进行总结,如打包成test.jar 文件
Manifest-Version: 1.0
Main-Class: windows.VideoWindow
Class-Path: lib\jetty-6.1.26.jar lib\aspectjweaver-1.6.12.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里面.必须写上你要使用的类. 否则总会提示您编译出错.
2、MANIFEST.MF 文件中奇怪的分行和空格要求
工作中发现的一个非常奇怪也很有趣事情,有关MANIFEST.MF文件中的分行和空格的格式要求,分享给大家。
对于通常的MANIFEST.MF文件,一般格式是:
Class-Path: lib/a.jar lib/b.jar lib/c.jar lib/d.jar lib/e.jar lib/f.jar
在一行之内将所有的jar包路径写上,空格分隔即可。
但是对于一些大型的项目,因为依赖包众多,比如大于30个,那么如果还写在一行内,就会出现一个长度惊人的行。程序运行倒不会有任何问题,但是对于版本控制就很不友好,如增加或者减少一个依赖包,这行就会被改写。以后compare不同版本时,只能知道这行被修改了确无法直接知道是做了什么修改,必须通过其他方式才能对比出来。
同样的问题发生在code merge时,如果两个分支都修改了这个文件,就必须通过手工来进行merge,而且要对照出来彼此到底改了什么,很困难而且容易出错。
因此一个改进就是将这个文件中的依赖按照一行一个依赖的方式重写,这样以后修改时只会修改改依赖所在的行,很容易就对比出来具体做了哪些感动,code merge时版本控制软件一般也很容易直接自动merge成功。
修改后的文件类似如下:
Class-Path: lib/a.jar
lib/b.jar
lib/c.jar
lib/d.jar
lib/e.jar
lib/f.jar
但是在实际操作时发生了意料之外的问题,会出现异常或者类无法找到,经检查发现问题出现在MANIFEST.MF的格式上,MANIFEST.MF对于分行和空格是有特殊要求的:
1. 每行的最后一个jar的名称后不容许有空格
即" lib/b.jar"在b.jar后必须回车结束本行,不能有空格,一个都不能
2. 每行的开头必须有不少于2个空格
即" lib/b.jar"在b.jar前必须有不下两个空格
以上两个条件有一个不满足都会出现问题,有点古怪。
3、严格的MANIFEST.MF格式
今天才发现这个文件的格式要求比较严格,因为使用的包比较多,所以那个Class-path的内容就比较多,我全部放在了一行,结果服务器启动读取那个文件的时候报错,错误信息是行太长,把它们切成多行,结果又是无效的头字段(java.io.IOException: invalid header field),和工程里面的其它文件比较了下,发现换行后要在前面加一个空格,后来又发现明明包含了一个包,但是找不到类,又在每行的后面加了一个空格,这下才完全搞定。
相关推荐
标题中的"MANIFEST.MF 文件内容详解(转)"是指一篇关于理解Java应用程序的MANIFEST.MF文件的文章。MANIFEST.MF文件是Java档案(JAR)文件格式的一部分,它包含了有关JAR文件元数据的重要信息。这篇博文可能是从其他...
### Java文件打包知识点详解 在Java开发过程中,经常会遇到需要将多个类文件、资源文件等进行打包处理的情况,以便于程序的部署与分发。本文将详细介绍如何通过命令行方式来实现Java文件的打包,并结合具体的示例...
### MANIFEST.MF 文件详解 `MANIFEST.MF`文件是`JAR`包的元数据入口,它的每一行都由键值对组成,键和值之间用冒号(:`)分隔。例如: ``` Main-Class: com.example.Main Created-By: John Doe Class-Path: lib/...
3. **添加清单文件**:清单文件(MANIFEST.MF)用于指定主类(Main-Class),用于执行JAR文件。可以使用`jar cmf manifest.mf jarfile.jar classfiles`来创建带有清单的JAR文件。 4. **更新JAR文件**:如果需要修改...
本文将围绕“Eclipse项目打包与发行”的核心概念,深入探讨如何通过Eclipse将项目打包成JAR文件,并详细解释关键配置文件`MANIFEST.MF`的作用与设置,以及如何处理特定于Eclipse的SWT/JFace组件,确保跨平台兼容性。...
### Java应用程序的打包...Java应用程序的打包发布是开发过程中不可或缺的一环,通过合理利用`jar`命令和`MANIFEST.MF`文件可以有效地管理和发布Java程序。理解并掌握这些基本概念和技术对于Java开发者来说至关重要。
lib文件夹用于存放所有需要的jar包,而META_INF文件夹用于存放MANIFEST.MF文件。在MANIFEST.MF文件中,开发者需要将lib下的所有jar包路径写入。然后,选择文件,点击Project Strucure...,选择Artifacts,将MF配置...
- **META-INF文件夹**: 每个Jar文件都包含一个名为META-INF的特殊文件夹,其中存放MANIFEST.MF文件,该文件记录了Jar文件的相关元数据信息。 **2. MANIFEST.MF文件** - **作用**: MANIFEST.MF文件是Jar文件的核心...
在这个命令中,cvfm是jar命令的选项,test.jar是生成的JAR文件名,manifest.mf是MANIFEST文件的名称,test是要打包的目录。 制作可执行的JAR文件包需要编辑MANIFEST文件,并使用jar命令将Java程序打包成JAR文件包。...
JAR文件实质上是一个遵循ZIP文件格式的压缩文件,它包含了一个名为`META-INF/MANIFEST.MF`的特殊文件,该文件包含了关于JAR文件的重要信息,比如类路径和主类信息。 1. JAR文件包结构 JAR文件的基本结构与ZIP文件...
它类似于常见的ZIP格式,但具有更高级的功能,比如可以在JAR文件内部包含一个`META-INF/MANIFEST.MF`文件,用于定义JAR文件的元数据,例如主类、依赖关系等。 #### 二、JAR命令参数详解 JAR命令由JDK提供,位于JDK...
`manifest.mf`文件需要包含`Main-Class`的定义,`test`则是你要打包的目录。 3. **运行可执行JAR** 在Windows系统中,JRE安装后会将`.jar`文件关联到`javaw.exe`,用户可以直接双击运行。在命令行中,也可以通过...
Java Archive (JAR) 文件是Java平台特有的归档格式,用于集合多个类文件、资源文件以及其他...此外,通过MANIFEST.MF文件,开发者可以指定主类(使得JAR可直接执行)、指定版本信息等,增强JAR文件的功能性和可管理性。
JAR文件的一个显著特点是它支持类路径(classpath)和清单文件(MANIFEST.MF),这使得JAR文件不仅可以包含程序代码,还可以包含版本信息、依赖库等元数据。 #### 二、JAR命令参数详解 JAR命令的基本格式如下: ``` ...
`jar`文件实质上是一种基于ZIP压缩格式的文件,包含了Java字节码(`.class`文件)、资源文件以及一个称为`MANIFEST.MF`的元数据文件。 `jar`命令提供了多种选项来操作`jar`文件,例如: - `-c`:创建新的`jar`存档...
JAR文件是一种遵循ZIP文件格式标准的归档文件,但与普通的ZIP文件不同的是,它包含了一个名为`META-INF/MANIFEST.MF`的特殊文件,用于存储元数据。这个元数据文件记录了JAR文件的一些关键信息,如主类名、类路径等,...