You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK11构建仅含.class文件且保留子目录结构的JAR包方法

解决方案

问题核心是shell默认通配符不会递归匹配子目录文件,直接匹配全目录又会纳入所有后缀的文件,以下方案适配JDK 11.0.15环境,可直接使用:

方案1:类Unix环境(Linux/macOS/Git Bash)单行命令

进入项目根目录(存放enderbyteprograms、META-INF文件夹的目录)执行:

find enderbyteprograms -type f -name "*.class" | xargs jar cvfm consolegames.jar META-INF/MANIFEST.mf

命令会递归查找enderbyteprograms下所有.class后缀的文件,保留完整相对路径传给jar工具,既不会破坏目录结构,也不会带入.java源文件。

方案2:全平台通用方法(Windows CMD/PowerShell/类Unix均支持)

利用JDK原生支持的「从文件读取待打包列表」特性操作,兼容性最好:

  1. 第一步生成所有待打包class文件的路径列表:
    • Windows CMD下执行:
      dir /s /b enderbyteprograms\*.class > classfiles.txt
      
    • Windows PowerShell下执行:
      Get-ChildItem -Path enderbyteprograms -Recurse -Filter *.class | Resolve-Path -Relative | Out-File -Encoding ascii classfiles.txt
      
    • 类Unix环境下执行:
      find enderbyteprograms -type f -name "*.class" > classfiles.txt
      
  2. 第二步执行打包,直接读取列表文件内的路径:
    jar cvfm consolegames.jar META-INF/MANIFEST.mf @classfiles.txt
    

打包结束后删掉临时生成的classfiles.txt即可。


注意事项

注意:你的MANIFEST.MF文件末尾必须保留一个空行,否则部分JDK版本无法正确识别Main-Class配置,会触发找不到入口点的报错。

  • 打包完成后可以执行jar tf consolegames.jar查看包内文件清单,确认目录结构完整、没有混入.java文件,再用java -jar consolegames.jar启动验证即可。

原有命令的问题

  • jar cvfm consolegames.jar META-INF/MANIFEST.mf enderbyteprograms/*.class:通配符*仅匹配当前目录层级的文件,不会递归处理子目录,缺失consolegames、consolegames/games路径下的class文件,因此找不到入口类。
  • jar cvfm consolegames.jar META-INF/MANIFEST.mf enderbyteprograms/*:通配符会匹配当前层级所有文件和子目录,子目录下所有后缀的文件都会被打包,因此会带入冗余的.java源文件。

内容的提问来源于stack exchange,提问作者Enderbyte09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:51:27