问题描述

在我们开发java应用时经常会导出为jar包形式运行或提供给别人使用,但一些时候没有注意到尤其使用Eclipse创建的项目默认package会是空的,在编辑器上显示(default package)这时候本项目可能没有问题,生成jar包后别人调用会根据包名找类,就会出现class not found 错误。

解决办法1

最简单的解决办法是正常引入,但是需要将使用的类也放在一个default package 下,这时不用 import 任何东西可以直接用到jar里的内容。或许在运行时仍会not fount报错,这是因为空包名可能没有被编译进去,只要手动将需要的class放在bin相应目录下既可。

这是临时解决,当新程序需要导出使用时仍然是空包状态,非常不利于后续版本更新维护,所以推荐下面办法2从根源解决。

解决办法2

使用工具重新打包jar彻底解决问题

  • 工具:jarjar.jar 。这是一个jar应用,可以将其他jar包内包名重命名并生成新的jar包
  • 下载地址:点击这里下载
  • 使用方法:

    1. 将jarjar.jar和需要重新打包的jar包放在在一个文件夹内。
    2. 在文件夹内创建rule.txt文件,写入打包规则并保存 语法:rule <pattern> <result> 解釋:rule 目前包名 要修改成的包名 eg: rule com.xfol.** com.xfol.test.@1 //规则将所有以com.xfol.开头的包名修改为com.xfol.test.开头

    注意:如果你是空包(default package),这里的目前包名应该写项目名

  1. 打开命令行运行jar包,生成结果。 命令:java -jar jarjar.jar process <rulesFile> <inJar> <outJar> 解釋:java -jar jarjar.jar process 规则文件 目前的jar包 新的jar包 eg:java -jar jarjar.jar process rule.txt xfol.jar newxfol.jar // 将过滤xfol.jar中的类套用rule.txt中的规则生成一个新的newxfol.jar文件

结尾

这是关于空包名的解决方法,推荐大家在创建项目时要注意规范命名防止出现这种问题,也是因为有好多老项目可能有这种情况,现代的ide大多都会即时检测提示。(但Eclipse现在还没有,仍然沿用default package)。

以上重点在jarjar的使用。其实jarjar还有更多用途,不过我目前还没有用到更多。有兴趣的同学可以猜考google的官方文档了解更多:Google Code

By 雪峰

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注