文档章节

可执行的jar包始末

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 606
阅读 50
收藏 0
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根路径。

© 著作权归作者所有

共有 人打赏支持
上一篇: impress.js rocked me!
下一篇: 说说效率
laichendong
粉丝 10
博文 85
码字总数 71483
作品 0
朝阳
程序员
私信 提问
用Maven快速生成带有依赖的可执行jar包

一、背景   最近项目在做微服务的拆分,那么我们想让我们的容器启动更加的轻量级,所以我们选择放弃tomcat等容器,而是通过maven生成带有指定依赖的可执行jar包的方式进行处理,本文我将分...

hafiz.zhang
2017/03/12
0
0
纯 Java 的可视化分布式计算平台--SimpleDistributedPlatform

一个简单却实用的分布式计算平台,通过提交任务 jar 包来执行分布式任务。 NameNode 和 DataNode 这两个名字是直接引用的 Hadoop 里面的概念,但是更加简化: NameNode:用于分发可执行 jar ...

抗争的诗人
2017/07/18
241
0
Linux下使用java -jar运行可执行jar包的正确方式

问题来源 一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持在线编译及打包,那么需要自己上传依赖的J...

u013063153
2017/03/21
0
0
制作可执行的JAR文件包及jar命令详解

常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译...

xinyitianii
2014/07/09
0
0
Java打包指南-JAR文件包及jar命令详解

常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译...

roockee
2011/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

7个习惯提升python效率

1. 使用本地变量 尽量使用局部变量,避免使用全局变量 2.减少函数调用 (1)当我们判断对象的类别的时候,尽量使用isinstance(),其次使用id(),最不济使用type()   type(num)==type(0) type(...

糖宝lsh
13分钟前
2
0
mongodb使用

【mongodb全库备份:】 #cd /usr/local/mongodb/bin # ./mongodump 则会在当前目录生成一个dump目录,整个库会备份在这个目录下。 【指定数据库备份】 # ./mongodump -h localhost -d Hawkey...

硅谷课堂
17分钟前
1
0
hive count distinct和group by

首先,Hive的group by和count(distinct)都是去除重复的数据,某种程度上来说,两者产生的结果是一样的。 实例代码: select a,count(distinct b) from t group by aselect tt.a,count(tt...

张欢19933
21分钟前
1
0
day180-2018-12-17-英语流利阅读-待学习

“黄马甲”再上巴黎街头,马克龙成为众矢之的 毛西 2018-12-17 1.今日导读 圣诞将至,但此时的法国人都在担心周六的到来,因为巴黎的“黄背心”抗议活动已经连续进行了四周,举国上下人心惶惶...

飞鱼说编程
23分钟前
7
0
Deepin 下安装 Docker

Docker官网上并没有提供关于 Deepin 的 Docker 安装教程,由于 Deepin 是基于 Debian 的,所以可以参照官网 Debian的安装教程安装,但 Deepin 在定制过程中进行了大量修改,所以使用官方教程...

临江仙卜算子
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部