IDEA 2016与eclipse 4.5.1打运行jar包教程及打包失败的原因

现在手里有一个小项目Tank 其中用到了数据库所以用到了mysql驱动

1.先来看eclipse的打包过程

 点击项目右键export如下图


我们风别用JAR file与Runable JAR file创建

一.先用JAR file一路点击记着查找主类 生成Tank.jar

二.再用Runable JAR file这里有三个可选项

  1.这个意思是将需要的库榨取到jar里(不明白什么意思看下面的图)

  2.将需要的jar和库直接导入到生成的jar中(不明白什么意思看下面的图)

  3.复制需要的jar包和库提取到子目录中


将这三个依次生成的Tank1.jar Tank2.jar Tank3.jar与Tank.jar一并放到D:/JarTest 目录中,当生成Tank3.jar时多出了Tank3_lib文件夹,里面是mysql数据库驱动

三.分析

下面我们在命令行中输入java -jar Tank*.jar分别测试

Tank.jar会出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Tank1.jar正常

Tank2.jar一会出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Tank3.jar正常

现在我们用jd-gui分别查看jar包分别查看它的文件目录 和清单文件

 1.


Tank.jar很干净只有我们写的class和清单,清单中只有我们选择的主类,没有mysql相关驱动类所以运行不起来

2.


      Tank1.jar可以清楚地看出它把mysql驱动包里的所有东西与咱们自己写的class混合到了一起,还有驱动包里的services(这个东东是干啥的看我另一片转载人家的博客点击打开链接)下的java.sql.Driver也被加进去了。这时候运行正常是因为Class-path为当前路径及在jar中的mysql驱动类所以运行成功。

3.

     Tank2.jar的Main-class为什么不是com.hanghang.ui.TankWindow呢?原因是加载的时候是通过org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader主类再加载com.hanghang.ui.TankWindow类。 这个com.hanghang.ui.TankWindow类可以找到的但是jdbc相关类找不到,为什么呢?

    通过反编译的java代码和调试我们知道了org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader加载别的jar的时候通过URL.setURLStreamHandlerFactory(参看点击打开链接)拓展了URL的协议所以说这个 Rsrc-Main-Class当前的jdk1.8不认识所以说报错(目前认识到这里)

4.



tank3.jar与Tank.jar一样干净但是MANIFEST.MF多了Class-Path: . Tank3_lib/mysql-connector-java-5.1.6.jar 就是这一点就运行成功在Tank.jar中的清单文件中也加入Class-Path: . mysql-connector-java-5.1.6.jar 把mysql-connector-java-5.1.6.jar 复制到与Tank.jar同一个目录你会发现这时候运行成(MANIFEST.MF相关介绍参看http://blog.csdn.net/zhifeiyu2008/article/details/8829637)
2.IDEA打包
按快捷键ctrl+shift+alt+s弹出项目结构选择 artifact

从你项目中选取一个模块

1.选择extract to the target JAR时与eclipse的Tank1.jar 包情况一模一样( 把在项目中用到的Jar包解压开,当成项目的一部分,打包到最后的Jar包中。但是这样会有一个问题,即,如果项目中 引用的Jar 包有签名 ,最后打包成的Jar包运行时会抛出错误:
“java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”
)按确定

         在这个页面我们可以写Class Path中的jar 或目录(即选择你所依赖的jar),IDEA会将这些依赖的信息生成到此模块的**( 你的路径)\Tank\META-INF\MANIFEST.MF文件的的Class-path属性中(对应于jar中的MAINIFEST.MF清单文件) 。是不是IDEA很方便。
         这里还可以打开D:\杨召成\IntelliJ IDEA WorkSpace\JavaSE\Tank\META-INF\MANIFEST.MF自己动态修改(如下图)。
     
       这是IDEA模块思想的重大好处,这里还可以将生成的jar提供给这个项目的其他模块或者整个项目IDEA,将相关的配置写在 模块名.imp 或项目名.imp文件中。是不是现在感觉IDEA比eclipse方便多了。
最后菜单栏Build->Build Artfiacts去输出路径找吧
2.选择第二个的时候与eclipse的第三个一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值