idea和gradle打包jar方法

前言

        这几天目前正在做的这个项目差不多编码已经大致的完成了,需要的就是把项目打包成jar包,研究了几天如何打包jar,遇到了很多问题,最终打包成功,下面分享给大家。

一 Idea打包jar

        因为本人用的开发环境是IntelliJ IDEA,开始的时候研究了一下利用这个开发工具进行打包

首先按F4或者点击IDEA右上角这地方

进入项目结构管理器

选择这里面的Artifacts。开始我完全不知道Artifacts是什么东西,后来查阅了点资料:Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;意思我理解的就是Artifacts就是告诉我们的程序因该如何打包这个项目。

之后新建一个Artifacts

这有两个选项选择第二个,从模块中引入,点击进去后会有一些设置,如下:

module是你需要打成jar包的项目

MainClass是运行的主函数,如果不需要运行则可以不选择

jar files from libraries是项目打包的方式,下面选项大致的含义:

1:extract to the target jar:把所有文件倒入进一个jar包里

2:copy to the。。。。:把项目的依赖包导出和项目一个目录,通过MANIFEST.MF文件来引用jar包。

这里如果你的项目需要打成一个可运行的jar包推荐第二种,反之第一种。

设置完之后,就会新建一个xxx:jar,并进入进入xxx:jar的编辑页面

在我们需要进行一个输出目录布局的设置,我们可以看到,已经编译好的项目的jar文件(我的是eachend.jar)和其他导入的jar包混到一起的,很杂,我是点击output layout下最左边的文件夹图标新建了一个lib文件,把其他jar包拖拽进来(建议,也可以直接点OK完成)

但是我们这样做的话依赖的jar包的目录就会产生变化,这时候我们需要选中我们项目,在下方然后修改MANIFEST.MF中的Class Path  

修改成OK

到了这一步后Artifacts是写好了,保存之后就可以用来生成jar文件

点击build Artifacts后选择你刚刚生成的artifacts

build后就会在out的目录下生成对应的jar文件

最后进入项目目录 输入命令java -jar XXX.jar  就可以跑起来了  如下

 

二 gradle打包jar

        本以为项目打成jar包并且可以完美运行了后,这事就差不多完了,可是项目组长说:你这样打包是可以,但是如果其他人用Eclipes来开发的话,就不管用了。。。。。。哎,好不容易搞出来的一个方法被pass掉了,无奈之下就只有另换方法。

        因为项目我是用的gradle构建的,第一时间想起了用gradle打包。

        利用gradle进行打包其实非常非常简单,但是因为我平常只是简单用它来导包,以及构建项目,它的基本的一些东西不是很清楚,所以走了些弯路花了大半天的时间才搞出来,所以说有时候需要了解一下你所用的东西的一些基础和原理。

        在build,gradle中首先需要加上

 
  1. apply plugin: 'java'

  2.  
  3. apply plugin: 'idea'

 

来定义你自己项目使用的插件,apply plugin: 'idea'用于把项目构建成idea项目,apply plugin: 'java'用于添加Java插件,以及一些内置任务,打包jar就要用到这里的插件。

 
  1.  
  2. version = '1.0'

  3.  
  4. repositories {

  5. mavenCentral()

  6. }

这里用来声明版本号以及添加maven中心仓库地址

 
  1. dependencies {

  2. compile 。。。。。。。

  3. }

这里来添加项目所需要的依赖包

 
  1. jar {

  2. String someString = ''

  3. configurations.runtime.each {someString = someString + " lib\\"+it.name} //遍历项目的所有依赖的jar包赋值给变量someString

  4. manifest {

  5. attributes 'Main-Class': 'com.each.dubboMainEnd'

  6. attributes 'Class-Path': someString

  7. }

  8. }

打包的时候,这个地方很重要,用来设置jar文件的相关属性,这个地方把我坑了有点久,最后补了下gradle的基础知识,就搞出来了,这篇博客写gradle基础写的还可以,推荐给大家看看http://www.open-open.com/lib/view/open1447139848053.html

首先这定义了一个someString用来存放依赖包的信息,通过configurations.runtime拿到所有的运行时的依赖jar包,然后.each遍历他,通过it.name获取到每个的jar包的name,赋值。

manifest即是编译完成后生成jar包中的MANIFEST.MF配置信息

 
  1. task copyJar(type:Copy){

  2. from configurations.runtime

  3. into ('build/libs/lib')

  4.  
  5. }

  6.  
  7. task release(type: Copy,dependsOn: [build,copyJar]) {

  8. // from 'conf'

  9. // into ('build/libs/eachend/conf')

  10. }

建立函数copyJar 用于把依赖的jar复制到对应的目录下。

函数release即是我们打包的时候的执行的函数,dependsOn[build,copyJar]这里会让执行relese函数的时候先执行build(系统自带的函数) 和copyJar

最后通过gradle release命令进行打包

打包成功!

目录如下:

cmd下进入对应目录运行 java -jar XXX.jar

运行成功!

build.gradle 完整源码:

 
  1. apply plugin: 'java'

  2.  
  3. apply plugin: 'idea'

  4.  
  5.  
  6.  
  7. version = '1.0'

  8.  
  9. repositories {

  10. mavenCentral()

  11. }

  12. project.ext {

  13. springVersion = '4.0.4.RELEASE'

  14. minaVersion = '2.0.13'

  15. }

  16. dependencies {

  17. compile('com.alibaba:dubbo:2.4.9') {

  18. exclude group: 'org.springframework', module: 'spring'

  19. }

  20. compile( "org.apache.zookeeper:zookeeper:3.3.6") {

  21. exclude group: 'javax.jms', module: 'jms'

  22. exclude group: 'com.sun.jmx', module: 'jmxri'

  23. exclude group: 'com.sun.jdmk', module: 'jmxtools'

  24. }

  25. compile( "com.github.sgroschupf:zkclient:0.1") {

  26. exclude group: 'javax.jms', module: 'jms'

  27. exclude group: 'com.sun.jmx', module: 'jmxri'

  28. exclude group: 'com.sun.jdmk', module: 'jmxtools'

  29. }

  30. compile "org.springframework:spring-webmvc:$springVersion",

  31. "org.springframework:spring-web:$springVersion",

  32. "org.springframework:spring-tx:$springVersion",

  33. "org.springframework:spring-orm:$springVersion",

  34. "org.springframework:spring-jdbc:$springVersion",

  35. "org.springframework:spring-expression:$springVersion",

  36. "org.springframework:spring-core:$springVersion",

  37. "org.springframework:spring-context:$springVersion",

  38. "org.springframework:spring-beans:$springVersion",

  39. "org.springframework:spring-aop:$springVersion",

  40. "org.apache.mina:mina-http:$minaVersion",

  41. "org.apache.mina:mina-core:$minaVersion",

  42. "org.hibernate.common:hibernate-commons-annotations:4.0.1.Final",

  43. "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final",

  44. "org.hibernate:hibernate-core:4.1.0.Final",

  45. "com.alibaba:fastjson:1.1.33.android",

  46. "com.google.code.gson:gson:2.2.4",

  47. "org.jboss.netty:netty:3.2.5.Final",

  48. "mysql:mysql-connector-java:5.1.10",

  49. // "org.apache.zookeeper:zookeeper:3.3.6",

  50. // "com.github.sgroschupf:zkclient:0.1",

  51. "cn.jpush.api:jpush-client:3.2.9",

  52. "redis.clients:jedis:2.6.1",

  53. "javax.servlet:javax.servlet-api:3.1.0",

  54. "net.sf.ezmorph:ezmorph:1.0.4",

  55. "com.google.collections:google-collections:1.0",

  56. "org.json:json:20090211",

  57. "net.sf.json-lib:json-lib:2.2.1:jdk15",

  58. fileTree(dir: 'lib', include: '*.jar')

  59. }

  60.  
  61. jar {

  62. String someString = ''

  63. configurations.runtime.each {someString = someString + " lib\\"+it.name}

  64. manifest {

  65. attributes 'Main-Class': 'com.each.dubboMainEnd'

  66. attributes 'Class-Path': someString

  67. }

  68. }

  69.  
  70. //清除上次的编译过的文件

  71. task clearPj(type:Delete){

  72. delete 'build','target'

  73. }

  74.  
  75. task copyJar(type:Copy){

  76. from configurations.runtime

  77. into ('build/libs/lib')

  78.  
  79. }

  80.  
  81. //把JAR复制到目标目录

  82. task release(type: Copy,dependsOn: [build,copyJar]) {

  83. // from 'conf'

  84. // into ('build/libs/eachend/conf') // 目标位置

  85. }

总结:

        通过这个需求,我学到了很多:gradle的基础语法,jar包是怎么运行的,打包jar等,有事走些弯路并不是坏事,这会让你把你自己的不足的知识学到。说说这打包,个人推荐第二种两种方式,对于不怎么了解gradle的同学们可以试试第一种。

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值