Gradle构建可执行Jar包(转载请注明出处)

最近开始接触Java,认识到一个似乎比Maven好用的构建工具Gradle,还来不及细细研究,但是需要构建一个可执行Jar包。上网查了一下。中文的文章千篇一律的提到一个插件apply plugin: ‘executable-jar‘ (https://github.com/stigkj/gradle-executable-jar-plugin) ,也不知道是谁复制了谁的。

但是构建的时候不认这个插件,所以寻找其他方法。

用压缩软件打开Eclipse生成的可执行Jar包与Gradle构建的Jar包发现MANIFEST.MF文件内容不一样(初学Java,不知道是不是仅有这里不一样)。需要Main-ClassClass-Path两个属性。

Eclipse的Gradle插件用multiProject模板生成的项目中有这么一句

jar {
    manifest.attributes provider: ‘my cool company‘
}

相应内容出现在MANIFEST.MF中,所以查了一下,觉得不使用‘executable-jar‘插件应该一样可以解决问题,

先找到这个帖子

http://blog.csdn.net/hiarcs/article/details/6198945 (感谢作者)

大意是:

jar {
    manifest {
        attributes ‘Main-Clas‘: ‘your.Class‘
        attributes ‘Class-Path‘: ‘ext.libA.jar ext.libB.jar‘//添加所有依赖,用空格隔开    }
}

或查找libPath下所有Jar文件生成之:

jar {
    manifest {
        attributes ‘Main-Clas‘: ‘your.Class‘
        attributes ‘Class-Path‘: new File(libPath).list().findAll {
            it.endsWith(‘.jar‘) }.collect { "$libPath/$it" }.join(‘ ‘)
    }
}

由于我的绝大部分依赖是通过Gradle管理的。无法通过这种方式来生成,而且个人觉得太不灵活了。故FQ查外网,

找到这两个帖子

http://forums.gradle.org/gradle/topics/manifest_with_classpath_in_jar_task_for_subprojects

http://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle

大概的方法是:

jar {
    manifest {
        attributes("Main-Class" : "com.dcx.epep.Start",
                   "Class-Path": configurations.compile.collect { it.getName() }.join(‘ ‘)))
    }
}

这样即可以将所有被依赖的Jar文件拷贝到可执行Jar文件的目录。有人建议用runtime替换compile,查看Gradle官方文档23.5. Dependency management,runtime包含compile。故替换之。

有一个问题,如果我没有依赖,此代码会出问题(https://gist.github.com/simon04/6865179 第4个回复)

task addDependToManifest << {
    if (!configurations.runtime.isEmpty()) {
        jar.manifest.attributes(‘Class-Path‘: configurations.runtime.collect { it.name }.join(‘ ‘))
    }
}
jar.dependsOn += addDependToManifest

至此,还有一个问题,我需要将对应的被依赖的Jar文件拷贝至对应目录

http://blog.csdn.net/maosidiaoxian/article/details/24456267 这个文章说了一些方法,但是不符合我的要求。

又找到这个帖子http://www.zhihu.com/question/20760722 (感谢原回复者):

要看是什么类型的项目,如果是JEE Web工程,通过war插件就可以导出完整的war包了,可以参考Gradle的手册 如果需要把jar包copy到一个自定义的目录,可以这么写:

task copyJars(type: Copy) {
  from configurations.runtime
  into ‘dist‘ // 目标位置
}

Gradle的很多技巧都可以到这个Wiki找到:Cookbook - Gradle

(转载请注明出处http://www.cnblogs.com/yongtao/p/4104526.html)

而且我不希望是可执行Jar所在的目录。故改进之,得到我自己的代码。注意了,以下代码需要放在dependencies之后。

jar {
    manifest {
        attributes("Implementation-Title": project.name)
        attributes("Implementation-Version": version)
        attributes("Main-Class": "com.mygoogle.manager.ManageServer")
    }
}

task addDependToManifest << {
    if (!configurations.runtime.isEmpty()) {
        jar.manifest.attributes(‘Class-Path‘: ". manageer_lib/" + configurations.runtime.collect { it.name }.join(‘ manager_lib/‘))
    }
}
jar.dependsOn += addDependToManifest 

task copyDependencies(type: Copy) {
  from configurations.runtime
  destinationDir = file(‘build/libs/manager_lib‘)
}
jar.dependsOn += copyDependencies

其他参考文章:

http://www.gradle.org/docs/current/javadoc/org/gradle/api/java/archives/Manifest.html

时间: 2024-12-10 21:16:23

Gradle构建可执行Jar包(转载请注明出处)的相关文章

转载请注明出处: https://github.com/qiu-deqing/FE-interview

转载请注明出处: https://github.com/qiu-deqing/FE-interview Table of Contents generated with DocToc FE-interview $HTML, HTTP,web综合问题 常见排序算法的时间复杂度,空间复杂度 前端需要注意哪些SEO web开发中会话跟踪的方法有哪些 <img>的title和alt有什么区别 doctype是什么,举例常见doctype及特点 HTML全局属性(global attribute)有哪些

Gradle 打可执行jar包

初次使用Gradle,想和maven一样,把gradle项目打成可执行jar包,具体步骤: 1.下载gradle 版本,并配置环境变量, 下载地址:https://gradle.org/releases/ 再cmd下能执行gradle命令 2.idea 中新建一个gradle项目 3.build.gradle文件配置如下: apply plugin:'java' apply plugin:'application' jar{ manifestContentCharset 'utf-8' meta

dubbo总结(5)——使用maven构建可执行jar包

启动dubbo服务的的方法大概有三个 1.servlet容器类似tomcat 2.自建main方法,使用spring 3.使用dubbo提供的main方法 优缺点分析: 使用servlet容器会使得端口管理复杂,内存造成不必要的浪费.使用自建main方法,没有使用上官方提供的main方法会造成不可估计的错误,使用dubbo本身提供的main方法,可以实现优雅关机. 优雅关机我的理解是在所有服务都协调好的情况下实现服务的停止. 下面是main方法的代码 在构建的过程中,特别需要注意的是maven

完整项目:木子记事本(原创,转载请注明出处)。

一个较为完整的记事本App,记录,存储到数据库,编辑,保存. 运行效果图: Activity类: 欢迎界面: 1 package com.lixu.jishiben; 2 3 import com.gitonway.lee.niftynotification.lib.Effects; 4 import com.lixu.jishiben.R; 5 import com.lixu.jishiben.draws.Mydrawable; 6 import com.lixu.jishiben.until

原创:关于使用Mybatis插件自动生成造成批量插入转换成list集合的问题以及解决方案(转载请注明出处,谢谢!)

问题: 由于项目中需要批量插入的功能,然后我就用到了阿里的json包,将json数据转换成list集合在批量添加到数据库,但是这个过程中,我突然发现一个问题,之前接收前台传来的值是有的,但转换之后某些字段的值没有了,后面发现,原来是Mybatis自动生成插件做的怪,将实体类赋setter和getter方法时,并没有将属性大写,也就是说原本我的实体字段为gName;setter方法之后为setgName,这就违反了命名规则,但是阿里json包就出现了不能转换报Null的问题,经过试验,终于找到了解

查看思科路由器各种信息SHOW 命令总结----无私奉献版(转载请注明出处)

我们用putty连接路由器的控制台(console)看到命令提示符后我们就可以执行命令来查看和配置路由器了.这里总结在路由器上的最常用的show 命令. 1 show version :查看路由器的型号,IOS的文件名.路由器接口,内存,以及配置注册号等信息 2 show running-config:查看在内存中运行的配置命令.这个命令经常用来排除故障以及了解设备配置情况. 3 show startup-config :查看保存在路由器NVRAM(用于存放路由器的启动配置文件Startup-c

如何用console线连接路由器进行初始配置-----无私奉献版(转载请注明出处)

打开包装拿出路由器,需要为路由器进行基础配置,包括时间.访问密码.IP地址等,在初次配置后我们就可以通过telnet的方式来管理和配置路由器了.但这第一次配置是需要通过路由器上的console的口来实现的. 我们在初始配置的时候如何来连接路由器呢?请看下图,由于路由器的console线连接PC的一端是RS232 俗称9针串口(母头)接口,而现在的笔记本基本上都没有配备这种接口,所以我们要配备一个usb转RS232 (公头)的转换模块或者是线(自行购买,并且需要安装驱动). 连接图 连接好cons

以下是常用的代码收集,没有任何技术含量,只是填坑的积累。转载请注明出处,谢谢。

1. css 2.x 文字换行 /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 两端对齐 text-align:justify;text-justify:inter-ideogra 去掉Webkit(chrome)浏览器中input(文本框)或textarea的黄色焦点框 input,button,select,

快的与滴滴较量之杰哥分析(原创发帖,转载请注明出处)

我第一次用打车软件,那时候应该是在2013年10月还在长沙工作的时候,在出租车上看到 二维码名片,用微信扫一扫下载了快的app,那时候,快的可能应该还没有傍上支付宝这个大款,为什么可能,为什么应该,因为那个时候,第一还没有支付款, 第二,可能性分析,即使榜上了,至少支付宝支付,后来打车的时候就经常用快的,同一时期的应该有滴滴,比他们早出来的或者更牛掰的可能是大黄蜂打车还有其 它几个,后来大黄蜂倒下了,据说快的公司把大黄蜂的几个技术人员都吸纳了,至少,解决了他们的就业问题,给社会做了贡献.后来11