记录一下自己用IntelliJ IDEA打包jar的问题。主要是最近写了tinify的java版,打包jar出了点小问题,所以在这里记录一下。
先简单介绍一下用IntelliJ IDEA打包的流程,后面有就遇到的打包问题来说明如何解决。

一、jar打包流程

IntelliJ IDEA本身已经做得很强大了,我们只需要按照它提供的功能来操作就行了。这里是以我上篇文件写的java版tinify的api打包jar为例子讲的。

  1. 菜单:文件->项目结构…(也可以按快捷键ctrl+alt+shift+s)
  2. 在弹窗最左侧选中Artifacts->左数第二个区域点击”+”,选择jar,然后选择from modules with dependencies,然后会有配置窗口出现
  3. 最终的创建jar面板

    必须注意的是,必须有MANIFEST.MF文件。你创建的时候会自动创建这个文件的
  4. 生成jar文件
    内部版本号菜单

    弹出的小面板

    默认情况,生成的jar文件在classes下面
  5. 运行jar文件
E:\workspaces\JavaProjects\tinifyJava\classes\artifacts\tinify_jar>java -jar tinify.jar

二、打包jar有可能遇到的错误

有时,你打包出来的jar会出现这种情况

E:\workspaces\JavaProjects\tinifyJava\classes\artifacts\tinify_jar>java -jar tinify.jar
tinify.jar中没有主清单属性

解压tinify.jar,查看它的MANIFEST.MF文件内容

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: jwilson
Created-By: Apache Maven 3.2.3
Build-Jdk: 1.8.0_45

发现这个内容和我们src里面的MANIFEST.MF文件内容不一样,这个是src下面的MANIFEST.MF文件内容

Manifest-Version: 1.0
Main-Class: TinifyClient

两者的区别是

Main-Class: TinifyClient

明明是按照操作说明那里,在src下面增加MANIFEST.MF(自动生成的),为什么打包还是会出错呢。
后来仔细想了一下,发现编译后class的文件夹没有对应的MANIFEST.MF文件。

jar打包是需要class文件的,那么自然也是读取这个目录的MANIFEST.MF文件了。所以把MANIFEST.MF复制到默认生成class文件的文件夹:target,再次打包jar,问题得以解决。最终输出结果:

E:\workspaces\JavaProjects\tinifyJava\classes\artifacts\tinify_jar>java -jar tinify.jar
E:\workspaces\JavaProjects\tinifyJava\classes\artifacts\tinify_jar
根据配置来压缩图片
上传:E:\tinify\input\mail\bg\bg.png

终于可以正常运行了!