文章目录

  • 前言
  • 1. 打包 jar 包流程
  • 2. 可能遇到的问题
  • 2.1 MANIFEST.MF 文件已经存在报错
  • 2.2 已经删除的 jar 包配置再次打开时依然存在


前言

最近在了解 Java Agent 探针技术,在做 demo 的时候需要把代码打包成 jar 包,然后通过 java -javaagent:xxx -jar xxx 命令启动才能测试代码是否正确修改了字节码,因此有了这篇文章

1. 打包 jar 包流程

  1. 首先直接点击图示位置(也可以点击File --> Project Structure),打开项目结构配置
  2. ideajava打包jar idea打包jar包_jar

  3. 在打开的界面选择 Artifacts点击加号+ --> 选择 JAR–> 选择 From modules with depenencies 新建 jar 包配置
  4. ideajava打包jar idea打包jar包_编译打包_02

  5. 新建 jar 包配置界面如下所示,其中从上往下红框标记的都是需要注意的
  1. 首先选中需要打包的 Module,也就是对应模块
  2. 选中该模块中的主类,点击文件夹图标会自动检测这个模块中存在的主类,选择即可
  3. 选择选中模块依赖的第三方 jar 包在新的 jar 包中的存在形式,主要有两种选择:
    1. extract to the target JAR把模块依赖的 jar 包解压,将其内部包含的 class 文件直接合并到目标 jar 文件中。这种方式打包出来的 jar 文件通过 IDEA 查看,会发现其内部不仅包含我们指定的模块的源文件夹,也包含了依赖的 jar 包中的文件夹
    2. copy to the output directory and link via manifest: 将模块依赖的 jar 包直接打包进目标 jar 包内,第三方 jar 包依然独立存在。这种方式需要指定第三方 jar 包在目标 jar 包中的 Class Path,否则程序启动时无法正确处理依赖
  4. 选择一个创建 MANIFEST.MF 文件的文件夹,如果该文件夹下已经有 MANIFEST.MF 文件了则会在点击 OK 完成配置时报错,原因及解决方式见下节 2.1 MANIFEST.MF 文件已经存在报错
  1. 基本配置完毕则进入下一步,界面如下所示
  1. 左侧选中新建的 jar 配置,右侧红框处都是可以修改的部分,如 Name(jar 配置名称)Output directory(打包出的 jar 包的存在文件夹)
  2. Available Elements(可用元素) 用于选择需要打包进 jar 包中的文件,双击该选项下文件夹中的文件即可将其添加到 jar 包中
  3. 最后 Class Path 用于配置目标 jar 包中依赖的 jar 包,如果在上一个步骤中选择了 copy to the output directory and link via manifest 则一定要配置,配置值为依赖 jar 包在目标 jar 包中的相对路径,否则省略
  1. 配置完成,就会在上文步骤3第四步指定的文件夹中创建一个MANIFEST.MF 文件,打开该文件可以进行相关配置,比如笔者的配置如下,可以根据自身模块情况做修改
  2. ideajava打包jar idea打包jar包_jar_03

  3. 最后一步,点击Build–>Build Artifacts,在弹窗中选中目标 jar 包配置,然后在其右侧弹框中选择 Build 或者 ReBuild点击即可进行编译打包。打包完成后,可以在步骤4配置的Output directory(打包出的 jar 包的存在文件夹) 中找到目标 jar。笔者以 extract to the target JAR 方式处理第三方 jar 包,可以看到其依赖的 jar 包中的文件都合并到了目标 jar 包中
  4. ideajava打包jar idea打包jar包_java_04

  5. 启动目标 jar 包,只需要在终端中执行 java -jar 命令即可。以笔者为例,启动命令为
java  -jar /Users/xxx/workspace/demo/out/artifacts/src/src.jar

2. 可能遇到的问题

本节记录在打包过程中遇到的问题,给自己做个笔记,也希望读者可以避免踩坑

2.1 MANIFEST.MF 文件已经存在报错

这个错误会在新建 jar 包配置时发生,具体如下截图。其实错误信息已经写的很明白,就是在这个目录下 MANIFEST.MF 文件已经存在。一开始遇到这个错误可能会摸不着头脑,因为一般在 eclipse 下打包 jar 都需要我们手动创建 MANIFEST.MF 文件,而 IDEA 其实会自动帮助使用者创建 MANIFEST.MF 文件,当指定文件夹下已经有 MANIFEST.MF 文件则会报出这个错误。一般解决方法如下:

  1. 指定另一个文件夹作为 MANIFEST.MF 文件存在目录
  2. 将原文件夹下的 MANIFEST.MF 文件删除

自动创建的 MANIFEST.MF 文件不符合要求的时候,只要用户继续修改这个文件即可

ideajava打包jar idea打包jar包_java_05

2.2 已经删除的 jar 包配置再次打开时依然存在

这个问题的表现为已经点击了 - 按钮,删除了一个命名为 src的 jar 配置,但是再次打开该界面的时候这个配置又出现了

ideajava打包jar idea打包jar包_jar_06

这个问题产生原因很简单,IDEA 会将创建过的 jar 配置缓存在 .idea 文件夹中,只要找到该文件夹,删除对应的 xml 文件即可,如下图所示

ideajava打包jar idea打包jar包_java_07