可执行的jar包始末
可执行的jar包始末
laichendong 发表于3年前
可执行的jar包始末
  • 发表于 3年前
  • 阅读 41
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

bud(我写的一个基于模板大代码生成器)需要发布成一个可执行的jar。在打包和运行的时候遇到了一些问题,这里记录下来。 在idea中创建jar的方式是构建项目的artifact。使用快捷键: ctrl+alt+shift+s  弹出Project Structure 对话框。选中左边的artifacts就可以添加了。 20130128224728   创建过程根据提示,指定可main方法所在类,Apply! Build -> Build Artifacts... 万事ok! 是吗? 使用
java -cp a.jar -jar xxx.jar
一调用,报错了!显示:
Error: Invalid or corrupt jarfile bud.jar
怎么回事? 原来idea并没有把MANIFEST.MF打进去!没有这个文件,找不到main方法,自然报错了。于是加入MANIFEST.MF,内容如下:
Manifest-Version: 1.0
Main-Class: com.jd.pop.bud.BudMain
再运行,说ClassNotFound ,可是我明明在运行的命令中指定了-cp参数来指定classpath。为什么还会找不到类呢?继续google。找到 一篇文章说“当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误。” 这个和我现象是一样的。于是结合文中和 官方的指导,重新编写了manifest.mf:
Manifest-Version: 1.0
Class-Path: lib\commons-collections-3.2.1.jar lib\commons-io-2.0.1.jar lib\commons-lang-2.6.jar lib\dom4j-1.6.1.jar lib\jaxen-1.1.1.jar lib\log4j-1.2.17.jar lib\mysql-connector-java-5.1.17.jar lib\ojdbc14-10.2.0.4.jar lib\velocity-1.7.jar lib\xml-apis-1.0.b2.jar
Main-Class: com.jd.pop.bud.BudMain
( 由于我发布的结构是第三方jar在lib目录下,所以Class-Path里每个jar前都加了lib\做限定)再次运行,果然!可以找到依赖的jar了。但是一波未平,一波又起,这次跑出来了一个NullPointException!查看代码发现是: Thread.currentThread().getContextClassLoader().getResource("") 为null。为什么呢?这本是用来获取classPath更路径的代码。怎么这个也受影响了。想来想去应该是获取不到当前的classPath。于是在manifest.mf的classPath中加上 . 。再次尝试运行。一切正常! 总结一下,这次一共遇到几个问题:
  1. 如何打可执行的jar包,在idea中,除了制定main class外,还需要记得吧Mainfest放进去
  2. java -jar xxx.jar执行jar且依赖第三方jar时,需要在mainfest中指定依赖jar的链接,而是采用java的-cp参数
  3. mainfest.mf的Class-Path中需要加上. 才能在代码中去掉classpath根路径。
标签: bud classpath idea jar java
共有 人打赏支持
粉丝 9
博文 85
码字总数 71483
×
laichendong
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: